2015-02-11 184 views
1

下面是我的Python代码运行良好,直到我试图用别名来源的一些环境变量。从此它开始挂在session.recv_exit_status(),现在甚至拒绝执行ls命令。Paramiko SSH执行命令被卡在session.recv_exit_status()

#!/usr/bin/env/python 

import paramiko 
trans = paramiko.Transport(('fcd01.force.com',22)) 
trans.connect(username = 'user',password = 'pwd') 
session = trans.open_channel("session") 

session.exec_command('ls') 
session.recv_exit_status() # ** hangs ** 

while True: 
    if session.recv_ready(): 
     break 
    time.sleep(2) 
session.send('exit\n') 

stdout_data = [] 
try: 
    part = session.recv(4096) 
while part: 
    stdout_data.append(part) 
    part = session.recv(4096) 
except: 
    raise 

print 'exit status: ', session.recv_exit_status() 
print ''.join(stdout_data) 

任何线索如何提前?

+0

是否有你需要通过字节检索标准输出的原因?当它拒绝执行ls命令时,你得到的错误是什么? – 2015-02-11 05:53:21

+0

代码简单地挂在recv_exit_status(),它在那里被阻塞。 – user3565150 2015-02-11 06:02:00

+0

那么我知道的第一件事是,有一个paramiko导入错误,如果连接的代码不在函数中,它会导致导入死锁。请参阅:http://stackoverflow.com/questions/443387/why-does-paramiko-hang-if-you-use-it-while-loading-a-module/450895#450895 – 2015-02-11 06:06:28

回答

0

我身边有通过把连接和功能执行命令挂得到由于以下SO后:Why does Paramiko hang if you use it while loading a module?

至于代码而言,你需要使用try渔获物例如明确地关闭连接:

try: 
    session.exec_command("ls") 
except **some paramiko exception**: 
    session.close() 

但是,您的代码可以通过使用SSHClient进行简化。

import paramiko 

ssh = SSHClient() 
ssh.set_missing_host_key_policy(AutoAddPolicy()) 
ssh.connect(username="user", password="pwd", hostname="fcd01.force.com", port=22) 
try: 
    stdin, stdout, stderr = ssh.exec_command("ls") 
except SSHException: 
    ssh.close() 
else: 
    **do something with stdout then close the connection** 

使用while循环,并获得字节后面是更好,如果你正在寻找你意料中的特定提示信号输入更多的交互终端,例如执牛耳接入(sudo访问)。 如果您只发送一个命令并获取响应,然后发送另一个命令并获取响应,则每个命令都不会等待服务器上另一个命令的提示,但您绝对不需要读取传回的数据块。

另外,请记住SSHClient的exec_command()实际上会在完成时关闭底层传输,并且每次都会创建一个新传输。你总是需要明确地关闭ssh连接。

+0

你好,我发现了一个问题,并删除了死锁...问题是当我登录到服务器,在〜/ .bashrc我正在做/ bin/bash。如果我执行/ bin/bash然后执行该命令,则必定会有一些问题。一旦我删除它,代码开始正常运行。但是,最终目标是在bash中运行脚本。我不知道如何继续,但至少这个问题已经结束。 – user3565150 2015-02-11 08:03:13

0

是的,当试图运行交互式会话时,我搞砸了SSH连接。现在它永久锁定。这是当我通过命令行运行时的输出。

*** Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32. *** 
*** Remote Python engine is active *** 
>>> import paramiko 
>>> ssh = paramiko.SSHClient() 
>>> print ssh 
<paramiko.client.SSHClient object at 0x02EEDB10> 
>>> print ssh.get_transport() 
None 
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
>>> ssh.connect('fcd01.force.com',username = 'user',password = 'pwd') 
>>> print ssh 
<paramiko.client.SSHClient object at 0x02EEDB10> 
>>> print ssh.get_transport() 
<paramiko.Transport at 0x2ef8f90L (cipher aes128-ctr, 128 bits) (active; 0 open channel(s))> 
>>> print ssh.get_transport().is_active() 
True 
>>> ssh.exec_command('ls') 
(<paramiko.ChannelFile from <paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0x2ef8f90L (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>>, 

>>, >>)

打印SSH

如果我做标准输入,标准输出标准错误= ssh.exec_command(” ls'),然后打印stdout.readlines(),PyScripter挂起(或即使我从命令提示符运行脚本,它挂起)。看起来我首先需要断开或关闭与我不知道该怎么做的服务器的现有连接。

ssh.exec_command('ls')的输出在Pyscripter中被打印三次(3次),它在这里只被粘贴一次。