【问题标题】:Paramiko stdout readline() command hangs [duplicate]Paramiko stdout readline()命令挂起[重复]
【发布时间】:2020-09-20 08:02:40
【问题描述】:

我正在使用 python paramiko 库通过 SSH 连接到 FTP 服务器。我可以使用命令行访问服务器并使用 sftp 命令检索文件列表,但是 paramiko 似乎正在做一些阻止我检索输出的事情。这是我的python代码:

import paramiko
client = paramiko.SSHClient()

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

client.connect('###########',
        port=##,
        username='####',
        password='####',
        key_filename='#####')

stdin, stdout, stderr = client.exec_command('ls')

这一切都很好。然而下一行

stdout.readline()

只是坐在那里挂起。请注意,根据this thread,我什至没有尝试检索完整的输出,只是第一行。

我也试过

stdin.close()
print(stdout.readlines())

返回一个空字符串。这表明服务器可能正在等待输入,但是当我使用命令行时,我可以发送 ls 命令并获取输出,那么它可能在等待什么命令?

版本:

  • python 3.7.4
  • paramiko 2.7.1

【问题讨论】:

    标签: python-3.x ssh ftp paramiko


    【解决方案1】:

    您的 readline 可能在远程主机尝试返回之前执行:

    import paramiko
    client = paramiko.SSHClient()
    
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    client.connect('###########',
            port=##,
            username='####',
            password='####',
            key_filename='#####')
    
    stdin, stdout, stderr = client.exec_command('ls')        
    stdout.channel.recv_exit_status()
    print(stdout.readline())
    

    recv_exit_status() 将等待远程主机上的 exec_command() 返回。

    【讨论】:

    • 我尝试在执行 readline 命令之前等待长达 30 秒。服务器上只有少数文件(在 aws 上),而且我的互联网连接良好。我看不出这是问题所在。
    • 听起来您可能挂在 client.connect() 上,而实际上并未为 exec_command() 设置隧道。在连接周围添加一个尝试捕获并添加一个身份验证超时参数try: client.connect('###########', port=##, username='####', password='####', key_filename='#####', timeout=5.0) except (Exception) as e: return print('Error connecting to ssftp: {}'.format(e)) sys.exit(0)