文档章节

python ssh工具paramiko的修改

最新更新消息
 最新更新消息
发布于 2015/10/15 18:53
字数 611
阅读 128
收藏 4
点赞 0
评论 0

经常使用paramiko工具对几百台设备进行管理。主要是每天到上边取文件过来,作为备份。

今天发现程序运行了10个小时还没有结束,就上去看一个究竟。


查看日志,发现在取一台服务器上的文件时卡在那里了。自己手动ssh登录上去,执行了一个ls命令就卡住了,

原来是这个服务器的硬盘出问题了。怪不得取不到文件。


但是想想,程序应该是在一段时间内读取不到数据就超时退出的阿,怎么会卡在那里呢。找到执行命令的那段

sin, sout, serr = ssh.exec_command('tar -zc0 /data/important-file.txt')

这条语句是过去了,但是后边

sout.read(10240)

这条语句一直卡在那里,不动弹了。看来sout是没有设置超时的。查查paramiko的源代码吧。找了一下,在client.py中

    def exec_command(self, command, bufsize=-1)

        chan = self._transport.open_session()

        chan.exec_command(command)

        stdin = chan.makefile('wb', bufsize)

        stdout = chan.makefile('rb', bufsize)

        stderr = chan.makefile_stderr('rb', bufsize)

        return stdin, stdout, stderr


那个stout就是chan.makefile()出来的。继续看makefile

    def makefile(self, *params):

        return ChannelFile(*([self] + list(params)))

这里看不出什么,重点在ChannelFile的read方法上,查到read方法。ChannelFile继承了BufferedFile,因为文档中写道,这个

ChannelFile是个file-like的object, 所以_read方法应该是实际read去调用的方法。看代码

    def _read(self, size):

        return self.channel.recv(size)

很简单,是channel的recv方法(这个channel就是makefile时的第一个参数self,也就是transport.open_session()出来的那个chan)。

还是回到Channel去,recv方法

def recv(self, nbytes):

        try:

            out = self.in_buffer.read(nbytes, self.timeout)

        except PipeTimeout, e:

            raise socket.timeout()


        ack = self._check_add_window(len(out))

        # no need to hold the channel lock when sending this

        if ack > 0:

            m = Message()

            m.add_byte(chr(MSG_CHANNEL_WINDOW_ADJUST))

            m.add_int(self.remote_chanid)

            m.add_int(ack)

            self.transport._send_user_message(m)


        return out

从黑体的部分可以看出,原来recv是可以设置timeout的,只是paramiko默认的没有设置而已。好了,把timeout设置上,就OK。

修改了一下paramiko代码,运行了一下,程序也没有卡在那个地方,除了那台出问题的服务器,其余的都正常取到。

修改办法如下,修改client.py的exec_command方法如下

    def exec_command(self, command, bufsize=-1, timeout = None ):

        chan = self._transport.open_session()

        if timeout is not None:

            chan.settimeout(timeout)

        chan.exec_command(command)

        stdin = chan.makefile('wb', bufsize)

        stdout = chan.makefile('rb', bufsize)

        stderr = chan.makefile_stderr('rb', bufsize)

        return stdin, stdout, stderr

黑体部分为增加的部分。而在调用的地方,改为

sin, sout, serr = ssh.exec_command('tar -zc0 /data/important-file.txt', timeout = 20.0 )


© 著作权归作者所有

共有 人打赏支持
最新更新消息
粉丝 1
博文 39
码字总数 49637
作品 0
崇明
linux安装python常用的软件包和模块安装

一、安装软件pip yum -y install epel-release yum install python-pip pip install --upgrade pip 二、安装paramiko模块 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认...

漫然
07/12
0
0
在windows上安装paramiko模块

###环境: windows10 X86_64 ###需求: Python中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于 pycrypto模块,因此要在Python中使用SSH。所以我们需要先安装...

sxooky
2017/10/27
0
0
paramiko 模块远程管理 liunx 服务器

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux...

水滴石川1
06/26
0
0
python 利用paramiko批量管理功能示例

paramiko是基于python实现的ssh2远程安全连接,支持秘钥认证,实现远程命令执行,文件传输,中间ssh代理等功能 安装paramiko paramiko依赖第三方的crypto,ecdsa,python-devel yum install ...

super李导
05/23
0
0
paramiko在windows上的安装和使用

一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,...

zcl1101017794
06/26
0
0
paramiko在windows上的安装和使用

一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,...

zcl1101017794
06/26
0
0
paramiko在windows上的安装和使用

一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,...

zcl1101017794
06/26
0
0
windows下python SSH-Client模块paramiko的安装与修改

安装篇: 1. 下载并安装easy_install, 使用命令:C:Python27>python.exe ez_setup.py 下载RUL:http://peak.telecommunity.com/dist/ez_setup.py 2. 下载pycryto,根据实际版本进行下载并安装......

秦牧羊
2012/11/14
0
0
Python编写的ssh客户端[类似putty]

转载请注明出处:http://blog.csdn.net/jmppok/article/details/17588381 windows下可以通过putty以ssh方式连接linux主机。但putty也有一些问题:比如没有保存session,乱码等等。 偶然发现P...

jmppok
2015/03/25
0
0
python - paramiko的安装与使用

一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,...

北方攻城师
2014/10/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
6
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0
There is no session with id[xxx]

参考网页 https://blog.csdn.net/caimengyuan/article/details/52526765 报错 2018-07-19 23:04:35,330 [http-nio-1008-exec-8] DEBUG [org.apache.shiro.web.servlet.SimpleCookie] - Found......

karma123
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部