get_pty()通过sshClient有时会永久挂起paramiko

时间:2014-06-05 21:27:11

标签: python tcp ssh paramiko

在自动化脚本中,我需要ssh到几个服务器来收集一些数据。不幸的是,其中很少似乎有间歇性的问题,连接在get_pty()上永远挂起。

这是我的代码片段。有什么我可以做的来杀死连接?我当然使用python,不幸的是使用python,没有简单的方法来杀死一个线程:(

client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
connect(hostname, port=port, username=username, password=password, timeout=30)
self.__chan = self.__client.get_transport().open_session()
print self.__chan
print ' after'
print self.__chan.get_pty()

输出

<paramiko.Channel 1 (open) window=0 -> <paramiko.Transport at 0xd49410L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>
 after

我认为这个问题与正确尝试get_transport()或open_session()失败有关。如果是这样,我如何检测是否发生了问题?

1 个答案:

答案 0 :(得分:1)

根据paramiko关于get_pty的文档,“如果您要使用exec_command执行单个命令,则不需要(或不希望)调用此方法。” http://docs.paramiko.org/en/1.13/api/channel.html#paramiko.channel.Channel.get_pty

你有一个特定的理由来调用伪终端吗?如果您使用paramiko.client.SSHClient.exec_command,则无需调用。{1}。根据您的paramiko版本,exec_command也接受超时参数,以便该命令仅会阻塞一段时间。如果您的版本不允许使用此参数,则可以将客户端子类化以添加它。

from paramiko import SSHClient

class SSHClient_with_Timeout(SSHClient): 
    ## overload the exec_command method 
    def exec_command(self, command, bufsize=-1, timeout=None): 
        chan = self._transport.open_session() 
        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 

如果这不是您正在寻找的解决方案,您还可以设置日志记录。 paramiko记录到记录器“paramiko”,因此调用logging.basicConfig(level=logging.DEBUG)将允许您在“挂起”之前查看paramiko的内容。