脚本编程

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远程执行后台脚本“阻塞”问题 我写的远程命令通道上线之后,发现在远程脚本中后台再执行另一个脚本,通道会一直等待后台脚本执行完成才会返回,有时甚至会僵死。...
阅读全文
脚本编程

分享一个自写的Python远程命令和文件(夹)传输类

最近在跟一个自动化发布平台的建设事项,其中Linux系统的远程控制通道则由我独立开发完成,其中涉及到了Linux系统远程命令和文件传输操作。 因为之前写Linux系统密码管理系统的时候,用的是Paramiko的SSHClient。所以,我这次依然采用Paramiko来做实现,代码虽短,说起其中的坑,我也是一把辛酸一把泪的填上了。 先上完整代码: 简单说下用法: 代码很简单,不清楚的请注意代码中的注释,下面啰嗦下文件传输的说明: ①、规定目标文件夹(dst)必须以斜杠 / 结尾,否则识别为文件,而src因是实体存在,所以程序会自动判断是文件还是文件夹。 ②、当执行本地文件夹推送至远程文件夹时,将不会保留本地文件夹名称,而是将本地文件夹内的所有文件推送到远程文件夹内,比如: /data/srcdir/   传送到 /data/dstdir/ ,结果是srcdir下的所有文件会存储在dstdir 若想保留文件夹名称,请保证两端文件夹名称一致即可,比如: /data/srcdir/   推送到 /data/srcdir/ ③、文件传输demo: 将本地的/data/src.tar.gz推送到192.168.0.10服务器的/data/files/dst.tar.gz Ps:若action='pull'则表示将src拉取到本地的dst。
阅读全文
脚本编程

利用腾讯云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迁移工具等,感兴趣的朋友只需要看下 官方文档 就会弄了! 好了,折腾吧,骚年!好用的话,有钱的可以打赏,没钱的欢迎点赞,不怕一万多,不嫌一块少。。。
阅读全文
脚本编程

Python+Shell脚本结合阿里云OSS对象存储定时远程备份网站

导读:毋庸置疑,数据备份是网站可持续性运营中至关重要的一个工作,如果还没有做任何备份机制的网站,建议尽早完善,莫要等到追悔莫及。本文将分享一个安全稳定、快速可靠、花费廉价的备份方案。 一、优点分析 张戈博客在2年前已经分享过一篇关于网站备份的文章:《Linux/vps本地七天循环备份和七牛远程备份脚本》,今天将再次结合这个脚本,将网站数据通过阿里云内网备份到阿里云OSS。 对于阿里云OSS,想必大家都不会陌生,具体功能、特色这里就不赘述了。而利用阿里云OSS备份数据的教程方法,网络上已有不少分享,各种开发语言都有,用起来非常方便。 在我看来,用什么语言都是其次,主要还是看重了阿里云ECS到阿里云OSS可以走内网,相比我之前分享的备份到七牛的方案,速度更快而且流量免费! 我博客之前一直将数据每周一凌晨备份一份到七牛,也不敢每天都备份,因为备份的时候由于服务器上行带宽只有1M,就算是切片上传也会导致此时网站访问缓慢,影响蜘蛛抓取!所以,当我看到OSS可以走内网时,第一个想到的好处就是速度快,不影响服务器公网带宽,对网站的访问毫无影响,超赞! 因此,只建议部署在阿里云ECS(9折优惠码:r9itz9,新购可用)的网站使用OSS来备份,其他产品还要走外网备份到OSS就得不偿失了,还不如用七牛。 二、准备工作 ①、开通OSS,并创建备份Bucket 访问阿里云 OSS控制台,点击开通OSS,然后新建一个Bucket(名称自定义),注意选择ECS相同的区域(比如青岛的ECS我就选择华北1),并且选择私有读写权限: ②、创建认证密钥 在OSS控制台的右侧栏,点击安全令牌,创建用于管理OSS的密钥对: 创建得到的密钥对记得备忘一下,因为只能获取一次: 2016-10-29补充:看到倡萌的实践分享,他遇到从OSS界面申请的密钥居然不具备OSS访问权限,所以这里也“盗图”补充一下,如果密钥没有权限请如图添加即可: 三、SDK脚本 我根据OSS的帮助文件,选择了适用范围最广的Python SDK方案,并且额外加入了断点续传和上传百分比功能,测试成功。 ①、环境准备 OSS的Python SDK需要用到oss2插件,所以我们先安装一下。 如果服务器上已经安装了pip工具,可直接执行如下命令安装oss2插件: 若没有,则复制以下命令行到服务器上执行安装: ②、上传脚本 使用方法:将上述代码保存为 oss.upload.py,并上传到服务器,执行如下命令可开始上传文件到OSS: 其中: 1~2个参数是认证ID和认证密钥就是前文创建并备忘的密钥对。 第3个参数是青岛区域的OSS内网地址,其他区域请参考OSS帮助文档,自行选择。 第4个参数是前文创建的Bucket名称,比如mybackup1 第5个参数是要上传的本地文件的绝对路径 执行后,就能在OSS的Object界面看到了: ③、下载脚本 其实只需要有个上传脚本即可,因为备份文件可直接从Object界面下载。不过,为了方便在服务器上直接恢复文件,还是弄了一个下载脚本。 使用方法: 将上述代码保存为 oss.download.py,并上传到服务器,执行如下命令就可以下载OSS文件到本地: 其中: 1~2个参数是认证ID和认证密钥就是前文创建并备忘的密钥对。 第3个参数是青岛区域的OSS内网地址,其他区域请参考OSS帮助文档,自行选择。 第4个参数是前文创建的Bucket名称,比如mybackup1 第5个参数是存储在OSS的文件名称 第6个参数是保存到本地的文件绝对路径,若不指定则以相同名称保存到脚本相同目录。 好了,以上只是一个上传和下载的脚本,如果你之前已经有了成熟的备份方案,并且本地存储了备份文件,则可以使用上传脚本,结合crontab定时上传到OSS,如果没有请继续往下看。 四、定时备份 有了上传脚本,就可以结合之前张戈博客分享的七天循环备份脚本,实现循环备份到OSS了,既安全还节省OSS空间。 Ps:实际上,一个Python脚本就可以搞定备份压缩和远程上传OSS了,但是之前已经有一个现成的Shell备份脚本了,我就懒得重复造轮子了! ①、适合OSS的七天循环备份脚本 2016年12月16日更新: 1、完善crontab环境变量,解决定时执行中因mysqldump不存在导致备份文件为空的问题; 2、重写Shell脚本,功能没什么变化,也就是看得更顺眼一些。 ②、使用方法 将上述代码作如下修改: I、根据实际情况修改上述代码中的OSS上传函数代码,比如密钥对和Bucket名称(参考前文) II、替换代码中的mypassword为自己设置的压缩包密码,不修改的话压缩文件解压密码为mypassword 然后,将代码保存为backup.sh,上传到服务器(建议存放到和前文python脚本的相同目录),比如 /data/backup.sh,最后如下添加定时任务: 本文就不赘述7天循环备份脚本的功能和更详细的使用方法了,若还是不清楚请参考前文:Linux/vps本地七天循环备份和七牛远程备份脚本 全部完成后,就能实现本地7天循环备份和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个线程,速度自然不可同日而语矣。 其中,切割的份数即你想要开启的多线程数量,很明显,这种任务分割的思路虽然没有管道方案来的高大上,但是其思想更加简单易懂,而且通用性也更好,适合入门级的简单多线程任务。
阅读全文