脚本编程

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。
阅读全文