脚本编程

Python远程控制模块paramiko遇到的问题及解决记录

最近一直在开发自动化运维发布平台,底层命令行、文件通道主要基于paramiko模块,使用过程中遇到各种各样的问题,本文主要用于收集问题及解决记录,以备后续使用。 一、Error reading SSH protocol banner连接错误 这个关键词,在百度、谷歌一搜一大把的提问,也有少部分给出了解决方案,但是最终都无法解决,我经过不断尝试和解读paramiko源码,终于搞定了这个问题,在此记录分享下。 1、具体报错信息: 2、解决办法: 重新下载paramiko插件源码,解压后,编辑安装目录下的transport.py文件: vim build/lib/paramiko/transport.py   搜索 self.banner_timeout 关键词,并将其参数改大即可,比如改为300s: self.banner_timeout = 300 最后,重装paramiko即可。 3、下面的曲折、啰嗦的解决过程,不喜请跳过: 在谷歌搜到一个老外相关提问,虽然他说的是pysftp,其实也是基于paramiko: https://stackoverflow.com/questions/34288526/pysft-paramiko-grequests-error-reading-ssh-protocol-banner/44493465#44493465 他最后给出了他的解决方案: UPDATE: It seems the problem is caused by importing the package grequests. If I do not import grequests, pysftp works as expected. The issue was raised before but has not been solved 意思是,在paramiko使用前,先import grequests,就能解决问题。我照做之后,发现对手头的现网环境无效,可能错误产生的原因不一样。 但是,我从老外的问题描述过程中,找到了解决方法,他是这样说的: I have already tried changing the banner timeout from 15 seconds to 60 secs in the transport.py, but it did not solve the problem. 我看到有个timeout和transport.py,就想到现网那些报Error reading SSH protocol banner错误的机器也是非常卡,而且目测了下发起paramiko连接到报错的时间,基本是相同的。 于是系统中搜索,并找到了transport.py这个文件: /usr/lib/python2.7/site-packages/paramiko/transport.py 并搜了下banner,发现果然有一个参数设置,而且和目测的超时基本一致! 于是,顺手修改成300S,并重新测试发现没任何效果,依然15S超时。接着打断点、甚至移走这个文件,问题依旧!!看来这个文件不会被引用。。。 回到最初的报错信息,发现里面显示的是: 而系统里面搜不到这个问题,最后醍醐灌顶,发觉Python模块编译后,基本是以egg文件保存的,看来 必须修改源码才行了。 于是cd到paramiko的源码目录,执行搜索,找到2各transport.py文件: 尝试将文件中的 self.banner_timeout 值改成300,重新安装paramiko,结果一次性测试成功! 然后,我顺便在老外的帖子回答了下(请忽略蹩脚的英语),算是回馈吧! 二、paramiko远程执行后台脚本“阻塞”问题 我写的远程命令通道上线之后,发现在远程脚本中后台再执行另一个脚本,通道会一直等待后台脚本执行完成才会返回,有时甚至会僵死。...
阅读全文
脚本编程

利用腾讯云COS云对象存储定时远程备份网站

导读:2个月前,张戈博客分享了一篇Python+Shell定时备份网站到阿里云OSS的教程,已经有非常多的站长朋友用上了,反馈还不错,也有不少朋友提出了很多优化建议,比如上传完成后能否删除本地压缩包之类的,本文将继续分享另一种云端备份方案。 一、优点分析 内网传输:和阿里云OSS一样,腾讯云COS同样支持内网和外网文件传输,对于腾讯云服务器,使用内网传输绝对是最快、最稳定的备份方案! 免费方案:看了下腾讯云COS的定价说明,发现对于备份网站来说简直是绝佳搭档,甚至可以说是钻了个空子(希望腾讯云的同事看到别打我。。。)!为啥这么说? 看下定价方案: ①、入流量免费 相当于我们上传文件的流量都是免费的,不区分内外网哦!内网就不说了,都懂。 ②、各种免费额度 以七天循环备份(7份压缩包)以来算,单压缩包支持700M+(700M*7≈50G),应付一般网站的备份绝对是足够足够足够了! 从上述摘选的定价方案来看,腾讯云COS比阿里云OSS更适合做网站备份,关键他还适合在第三方服务器上做远程备份,因为不但入流量(上传)免费,出流量(下载)也免费10GB。 二、准备工作 ①、开通COS,并创建Bucket 访问腾讯云COS开通对象存储服务,然后如图创建Bucket: Ps:我们只用于备份,且为私密资料,所以选择私有读写。 ②、添加密钥 接着,我们点击左侧的密钥管理,进入密钥界面如图创建密钥,如果先前已经有密钥了,则可以直接使用: Ps:这里我们需要记住3个信息:AppID,SecretID和SecretKey,待会要用。 三、备份脚本 人生苦短,我用Python,这里就继续选择Python SDK来实现, ①、环境准备 如下顺序安装腾讯云Python SDK插件: 如果不是Centos,请自行搞定,这里不再赘述。 ②、上传脚本 参考官方SDK文档,写了一个简单够用的上传脚本: 使用方法:将上述代码保存为 cos.upload.py,并上传到服务器,执行如下命令可开始上传文件到OSS: 其中: 1~3个参数是appid、认证ID和认证密钥,也就是前文创建并备忘的密钥信息; 第4个参数是前文创建的Bucket名称,比如mybackup 第5个参数是需要备份的域名(新增的:主要是为了区分下) 第6个参数是要上传的本地文件的绝对路径 特别说明:更新到V4版本后,才发现还需要传入一个地域的参数,这里就不再修改脚本代码了,请直接修改上述代码的region 的值,否则会报404错误!目前可选有shanghai(华东)/guangzhou(华南)/tianjin(华北)/chengdu(西南),具体请看自己的COS所在地域以及腾讯云关于地域的文档。 执行后,就能在COS的Object界面看到了上传的文件: 四、定时备份 有了上传脚本,继续结合之前张戈博客分享的七天循环备份脚本,实现循环备份到COS了,既安全还节省COS空间。 ①、适合COS七天循环备份脚本 ②、使用方法 将上述代码作如下修改: I、根据实际情况修改上述代码中的COS上传函数代码,比如密钥对和Bucket名称(参考前文) II、替换代码中的mypassword=123456为自己设置的压缩包密码,不修改的话压缩文件解压密码为123456 然后,将代码保存为backup.sh,上传到服务器(建议存放到和前文python脚本的相同目录),比如 /data/backup.sh,最后如下添加定时任务: 本文就不赘述7天循环备份脚本的功能和更详细的使用方法了,若还是不清楚请参考前文:Linux/vps本地七天循环备份和七牛远程备份脚本 全部完成后,就能实现本地7天循环备份和COS远程备份了!如果,之前已经做了七牛远程备份的可以放心取消了。 之前有朋友留言说能否自动删除已上传的文件呢?这次修改简单的加入了一个是否删除的功能:只需要在脚本执行的最后追加一个 y 参数,成功上传到COS后就会自动删除本次备份的压缩包了(看不懂的慎用)。 在文章的最后,为了方便广大代码小白朋友,特提供本文涉及脚本的打包下载: 五、幕后花絮 在折腾SDK的时候,第一眼其实被腾讯云的说明文档虐到了: 只说了如何安装SDK插件,然后直接来个def函数,然后就没然后了,到底如何import这个SDK?一脸懵逼。。。 最后在github的 simple.py 中才找到了完整的DEMO: https://github.com/tencentyun/cos-python-sdk/blob/3.3/sample.py 在这懵逼期间,我甚至用上了腾讯云做好的本地迁移工具,实际也是非常好用,简单配置下就能在后台定时上传更新的文件到COS了: 篇幅有限,这里就不深入介绍了,除此之外,COS还提供了其他非常实用的工具,比如FTP工具、七牛以及OSS迁移工具等,感兴趣的朋友只需要看下 官方文档 就会弄了! 好了,折腾吧,骚年!好用的话,有钱的可以打赏,没钱的欢迎点赞,不怕一万多,不嫌一块少。。。
阅读全文
脚本编程

巧用echo命令解决Samba批量添加用户难题

最近实在太忙,没时间研究和折腾,所以也没有什么可以分享到博客的。果然,个人博客坚持原创太不不容易了。张戈博客上线2年多,从1天多更,到一天1更、一周一更,直到现在2星期可能有一更的节奏。。。 好了,废话不说了。翻了翻在工作上的印象笔记,发现还是有一些存货可以分享的。 挺久之前,组内新申请了一批开发测试机,需要部署环境。除了一些常见的软件要安装之外,还有一个我之前很少用到的Samba。 Samba的专业解释我就不贴了,百度百科啥的都有。说白了就是Samba安装到Linux服务器上之后,就可以将服务器上的目录映射到Windows、MAC等个人电脑上,类似于Windows的文件共享,使用相当方便,因此,Samba成了组内开发同事的刚需软件。。。(其实对于使用云服务器的站长,Samba可比FTP好用多了,直接本地开发编辑。。。这个后面有空再介绍吧) 这批开发测试机大部分都是基于Centos的Tlinux系统,所以使用yum install -y samba 就能安装了。安装后发现需要在每台服务器上都配置组内30多个成员的samba账号,手工单个的加太苦逼了,于是写了一个Samba批量添加用户的脚本了。 使用也非常简单,将如上代码保存为 addsmbuser.sh,然后将需要添加的用户名一行一个保存到一个文本文件,比如userlist,然后执行 sh addsmbuser.sh userlist 就能批量添加这些用户了,初始密码和用户名一致。 当然,直接执行 sh addsmbuser.sh  + 用户名 还能添加单个用户。 由于smbpasswd正常使用是需要交互进行的,也就是输入用户名,再输入密码,这种批量交互的活完全可以使用expect脚本来完成。但是本文比较巧妙的利用了echo -e 可以输出回车符(\n)的特性,非常轻巧的完成了任务。 暂时就写这么多,后面有时间再整理下坑爹的SuSE下如何编译安装Samba,以及Samba的简单使用。
阅读全文
脚本编程

分享一个入门级可控多线程shell脚本方案

说到shell可控多线程,网上分享的大部分是管道控制的方案。这种方案,张戈博客也曾经实战并分享过一次:《Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点》,感兴趣的朋友可以看看。 下面张戈博客再分享另一种更容易理解的入门级可控多线程shell脚本方案:任务切割、各个击破。 先来 1 段场景描述: 某日,在鹅厂接到了这个任务,需要在Linux服务器中,对几千个IP进行一次Ping检测,只要取得ping可达的IP就好。如果单个IP去ping测试,虽然也可以完成任务,几千个IP还好了,如果更多呢? 鉴于这个case简单程度,第一时间先放弃了以前用过的管道方案,而是采用了各个击破的思想。 简单思路: 按照任务切割的“战略思想”,我先将这几千IP存入一个iplist文件,然后写一个分割函数,将这个文件分成多份临时IP清单,最后,用多线程遍历这些临时IP文件即可变相实现多线程了。 具体代码: 将代码保存为ping.sh之后,执行  sh ping.sh  iplist 100 的过程如下: 先将iplist切割成100份,存放在 SplitFile 文件夹中 然后,通过for循环读取这些分割文件,并在后台使用while循环对其中ip执行ping命令。 由于while是丢后台的, 所以for循环会一次性执行100个while,相当于开启了100个线程,速度自然不可同日而语矣。 其中,切割的份数即你想要开启的多线程数量,很明显,这种任务分割的思路虽然没有管道方案来的高大上,但是其思想更加简单易懂,而且通用性也更好,适合入门级的简单多线程任务。
阅读全文
操作系统

解决dos2unix/unix2dos报错,并在家目录下生成u2dtmp*文件问题

最近接到一个 case:大数据分析那边反馈我们这边推送的数据同比去年同期少了很多。这是很不正常的,因为业务一直在增长。 于是,我开始顺藤摸瓜的跟进。一开始就发现一个小问题:scp 推送文件脚本执行后居然会报错: # sh pushdata.sh dos2unix: converting file pushdata.log to UNIX format ... dos2unix: problems renaming './u2dtmp8jwsge' to 'pushdata.log' output file remains in './u2dtmp8jwsge' dos2unix: problems converting file pushdata.log 原来是将生成的日志转换成Unix格式。按理说应该不会影响数据的推送,不过还是顺手处理下。 奇怪的是,人工去执行 dos2unix 却是正常的,看来和脚本有关系了。看了半天的脚本,也没看出哪儿有明显的错误: dos2unix  /data/pushdata.log 还是先不浪费时间自己摸索了,直接丢百度一下,发现并没有什么luan用。进而丢谷歌,终于在一个国外论坛找到了正确的解释: It turns out that when you run the script from cron your current directory (PWD) is set to your home directory. Unix2dos creates the temporary file used in the conversion in your home directory then can't find it to rename it. Not sure why it can't find it. I added a change directory command (cd) and Unix2dos worked. 大概意思是,crontab 计划任务中的脚本当前执行路径默认会设置为家目录。所以,dos2unix/unix2dos 会在家目录下创建转换后的临时文件(u2dtmp****),导致命令无法在目标路径找到将临时文件,并重命名为被处理的文件名,作者表示他也不知道为什么会找不到。不过他给出的解决办法就是:在脚本里面加入cd到日志所在路径的命令即可。 比如,本文case中可以在脚本一开始处加入...
阅读全文
操作系统

Linux在批量服务器管理中实用的PS1命令提示符格式

作为一个大公司的运维,手头管理了成百上千的服务器是家常便饭,甚至更多。而我们一般都是用跳板机登陆,由于这些机器一般都是克隆或者虚拟化出来的,所以登陆后的命令行提示符几乎是一个模子刻出来的,比如都是:# 这时,我们肯定会经常遇到这样一个困扰:操作服务器时因某事中断,回头继续操作的时候肯定会ifconfg确认下是否是我要操作的服务器,因为无法从表象识别。 所以,我们很有必要将这个PS1命令行提示符优化一下。每个运维攻城狮肯定都有自己的习惯,不过我还是推荐一个服务器批量管理中比较使用的PS1格式吧! PS1是神马?PS1是linux里头的一个默认的环境变量,至于当前系统的PS1是如何设置的,你可以使用命令“env|grep PS1”来查看 。 其实PS1就是用来设置命令提示符格式的环境变量。 下面贴一下PS1的配置参数: 当然,为了更好的识别,我们还可以加入一些颜色设置,这个就不赘述了,百度一下shell颜色即可,当然记得参考下文的PS1进行自定义。 为了更好的区分服务器,我建议使用如下格式: 所以PS1可以如下设置: 但是机器太多,这个IP总不能每次手动修改,所以还是写个脚本来修改吧!(当然,你也可以先获取IP,赋值变量加入到PS1) 脚本很简单: 好了,最后直接 source ./update_PS1.sh 即可看到效果: 重新登陆或source /etc/profile,就可以看到效果了: 这样设置之后,就能清晰的知道现在操作的是服务器是哪一台,而不至于混淆。
阅读全文