【问题标题】:How to check ssh.exec_command executed successfully or not? [duplicate]如何检查 ssh.exec_command 执行成功与否? [复制]
【发布时间】:2020-12-08 22:18:12
【问题描述】:

我正在远程主机内执行 gcloud 命令。 但是,当我尝试使用 ssh.exec_command 执行任何命令时,该命令似乎已被执行。但是我怎样才能确保它正确执行。

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname = HOSTNAME,username = USERNAME,key_filename = FILENAME)
firewall_list = [gke-cluster-XXX-all,gke-cluster-XXX-ssh,gke-cluster-XXX-vms]
cmd = 'gcloud compute firewall-rules delete'+firewall_list
stdin,stdout,stderr = ssh.exec_command(cmd)
ssh.close()

如何检查 ssh.exec_command 是否成功执行?

谢谢

【问题讨论】:

    标签: python ssh stdout paramiko execcommand


    【解决方案1】:

    有几种方法,但一般来说,您应该只评估正在执行的命令的退出代码:

    stdout.channel.recv_exit_status()

    请注意,这仅适用于 Martin Prikryl 提到的简短输出或快速命令,否则会死锁。

    根据正在执行的命令,您可以检查零退出代码或根据命令排除特定退出代码。

    cmd = 'gcloud compute firewall-rules delete'+firewall_list
    stdin,stdout,stderr = ssh.exec_command(cmd)
    # Verify this condition applies to your specific case
    if stdout.channel.recv_exit_status() != 0:
       # error handling, your command was not succesful
    ssh.close()
    

    虽然不是首选,但您也可以在 stdout 和 stderr 上验证 readlines() 或 read() 的内容,但这通常不是必需的。

    【讨论】:

    • 虽然您对recv_exit_status 的看法是正确的,但您不能这样使用它,因为代码可能会死锁。您必须在等待命令完成时使用命令输出。见Paramiko ssh die/hang with big output
    猜你喜欢
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2016-10-27
    相关资源
    最近更新 更多