python ssh工具paramiko的修改

经常使用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 )

时间: 2024-12-12 09:53:12

python ssh工具paramiko的修改的相关文章

python ssh之paramiko模块使用

1.安装: sudo pip install paramiko 2.连接到linux服务器 方法一: #paramiko.util.log_to_file('ssh.log') #写日志文件 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允许连接不在~/.ssh/known_hosts文件中的主机 client.connect('ip',22, 'userna

python ssh 连接远程服务器,修改文本内容,调用脚本

今天小编get到一个用python的paramiko库创建ssh对象,连接到远程服务器,并且修改文件内容,调用脚本的好方法!! 主角当然是paramiko库啦,利用paramiko创建一个ssh对象,用于连接远程服务器 import paramiko ssh = paramiko.SSHClient()#创建SSH对象 设置允许连接不在know_hosts的主机,ssh会将 访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts,当下次访问相同计算机时,OpenS

python学习:paramiko登录ssh

#!/usr/bin/env python #coding:utf-8 import paramiko ssh=paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) private_key=paramiko.RSAKey.from_private_key_file('id_rsa') ssh.connect(hostname='20.55.85.15',port=22,username='ro

【PYTHON模块】paramiko模块与主机SSH连接

还记得前一节做的socket和socketserver吗?写了很多实现了一个小功能,但是今天的paramiko真让人有种土枪换炮的感觉! paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台.利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输. 本文只演示paramiko连接li

Python第三方库paramiko SSH连接

基于用户名和密码的sshclient方式登录: #!/usr/bin/env python #-*- coding=utf-8 -*- #说明:基于用户名和密码的sshclient方式登录 import paramiko try:     ssh = paramiko.SSHClient()     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())     ssh.connect(hostname="192.168.58.136&

python批量执行paramiko

puppet 分发软件  同步文件 ssh-批量执行-paramiko-比较好的模块 直接修改远端主机的host文件 python批量执行paramiko,布布扣,bubuko.com

python组建之paramiko的简介和简单使用

参考文献: http://www.cnblogs.com/gannan/archive/2012/02/06/2339883.html pydoc paramiko paramiko简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此

PyCharm 配置远程python解释器和在本地修改服务器代码

PyCharm 配置远程python解释器和在本地修改服务器代码 最近在学习机器学习的过程中,常常需要将本地写的代码传到GPU服务器中,然后在服务器上运行.之前的做法一直是先在本地写好代码,然后通过FileZilla这样的文件传输工具来将写好的文件传到服务器,再通过ssh工具远程连接到服务器,执行相应的python脚本.这样的方式十分繁琐,效率很低.今天听到朋友提到了配置远程解释器 使用场景 先说说自己的使用场景,我是在什么情况下,需要将IDE配置成这样的环境来方便我的工作. 首先,我需要在本地

python学习笔记--Paramiko模块安装和使用(转)

首先安装依赖 yum -y install gcc 1 安装 pycrypto wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz tar -xf pycrypto-2.6.tar.gz cd pycrypto-2.6/ python setup.py build && python setup.py install 测试,注意大小写 python>> import Crypto 2 安