【问题标题】:Using process.communicate after popen failspopen 失败后使用 process.communicate
【发布时间】:2015-12-16 07:46:35
【问题描述】:

我正在尝试使用 ssh spawn 向远程机器发送命令。 我正在使用Popen() 发送命令,我可以看到命令已完成,但之后我尝试使用communicate()(关闭会话并获取返回码)并且程序卡住了。

cmd = """expect -c 'spawn ssh -o LogLevel=quiet """ \
      """-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey """ \
      """-o ConnectTimeout=10 -2 -o CheckHostIP=no -i {0} {1}@{2} ;\
      """expect "#";send "mkdir test9\n" ;interact'""".format(self.sshKey, SSHUser, self.hostname) 
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p_stdoutdata, p_stderrdata = process.communicate()

当我到达通信时,程序卡住了。

【问题讨论】:

    标签: python ssh process popen communicate


    【解决方案1】:

    请勿使用Popen 调用ssh。相反,请使用在 Python 中在进程内完成所有工作的库,例如出色的 Paramiko。在您的情况下,它可能看起来像这样:

    import paramiko
    
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.WarningPolicy())
    client.connect(self.hostname, 22, SSHUser, password)
    
    sftp = paramiko.SFTPClient.from_transport(client.get_transport())
    sftp.mkdir("test9")
    sftp.close()
    
    client.close()
    

    【讨论】:

    • 如何发送 SSHkey 而不是密码?我怎样才能以这种方式获得返回码?如果我需要用户发送的其他推荐?
    • 请阅读文档 (docs.paramiko.org)。 client.exec_command()可以执行其他命令。如果你愿意,你可以通过key_filename 而不是password。至于如何获得返回码,我不确定你的意思,但如果你问如何找出mkdir 是否失败——它会引发异常。
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多