文档章节

python ssh工具paramiko的修改

最新更新消息
 最新更新消息
发布于 2015/10/15 18:53
字数 611
阅读 141
收藏 4

经常使用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
Python制作简易SSH登录工具

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏 下载W3Cschool手机App,0基础随时随地学编程>>戳此了解导语 做这个的起因大概是: 电脑里的Xshell不知道为啥突然显示“评估期已过”之类...

W3Cschool小编
08/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
28分钟前
1
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
36分钟前
1
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
58分钟前
0
0
JAVA集合之ArrayList

一、前言 Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类,JAVA常用的集合接口有4类,分别是: Collection:代表一组对象,每一个对象都是它的子元素 Set:不包含重复元素...

木木匠
今天
3
0
转:XMLHttpRequest2 新技巧

”XMLHttpRequest 的异步调用网上找的例子运行没问题,但稍微改了一点点就报错”InvalidStateError: XMLHttpRequest has an invalid context“。断断续续 搞了3天终于通了,可以接收二进制文...

SamXIAO
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部