使用paramiko运行交互式shell时代码挂起

时间:2016-10-26 01:24:59

标签: python paramiko

我已经编写了以下代码,以交互方式在远程服务器中运行3命令

但是当我检查第3个命令从未执行且代码卡在这里是我的代码

def execute():
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('ipaddress', username='user', password='pw')

    chan = ssh.invoke_shell()  # start the shell before sending commands

    chan.send('cd /path to folder/test')
    chan.send('\n')
    time.sleep(3)
    chan.send("ls -l")
    chan.send('\n')
    buff = ''
    while not buff.endswith("test >"):
        resp = chan.recv(9999)
        # code stuck here after 'path to folder/test >' comes in shell prompt
        buff += resp
        print resp

    print "test"
    chan.send("ls -lh")
    chan.send('\n')
    time.sleep(5)
    buff = ''
    while not buff.endswith("test >"):
        resp = chan.recv(9999)
        buff += resp
        print resp

if __name__ == "__main__":
    execute()

当我跑步时,我得到ls -l的输出,但是ls -lh从未执行过我的代码卡在第一次循环中。任何人都可以帮助解决我的问题

1 个答案:

答案 0 :(得分:1)

代码有以下2个错误:

  • channel.recv的调用是阻止的,您首先应使用channel.recv_ready()检查频道是否有任何数据要读取

  • 也不要使用buff.endswith("test >")作为条件 file_name可能并不总是在buff中的最后一个。

将while块更改为以下,它将以您想要的方式运行

    while "test >" not in buff:
        if chan.recv_ready():
            resp = chan.recv(9999)    
            # code won't stuck here
            buff+=resp
            print resp