【问题标题】:Wait until task is completed on Remote Machine through Python [duplicate]等到通过Python在远程机器上完成任务[重复]
【发布时间】:2015-04-13 16:06:48
【问题描述】:

我正在 Ubuntu 上用 python 编写程序。在该程序中,我尝试在连接到网络的远程计算机 (RaspberryPi) 上完成“删除文件”任务后打印一条消息。

但在实际操作中,打印命令并不是等到远程机器上的任务完成。

谁能指导我如何做到这一点? 我的编码如下所示

import paramiko

# Connection with remote machine
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.2.34', username='pi', password='raspberry')

filename   = 'fahad.txt'
filedelete ='rm ' + filename
stdin, stdout, stderr = client.exec_command(filedelete)
print ("File Deleted")
client.close()

【问题讨论】:

    标签: python python-2.7 ssh remote-access paramiko


    【解决方案1】:

    这确实是paramiko SSH exec_command(shell script) returns before completion 的副本,但那里的答案不是很详细。所以...

    如您所见,exec_command 是一个非阻塞调用。因此,您必须使用以下任一方法等待远程命令完成:

    在您的特定情况下,您需要后者:

    stdin, stdout, stderr = client.exec_command(filedelete)  # Non-blocking call
    exit_status = stdout.channel.recv_exit_status()          # Blocking call
    if exit_status == 0:
        print ("File Deleted")
    else:
        print("Error", exit_status)
    client.close()
    

    【讨论】:

    【解决方案2】:

    除了按照 Sylvian Leroux 的建议做:

    如果您的命令涉及运行需要在 paramiko 关闭 ssh 会话后继续运行的 bash 脚本(每次发送命令时都会发生这种情况),请使用:

    nohup ./my_bash_script.sh >/dev/null 2>&1.

    nohup 告诉系统这个进程应该忽略 ssh 会话关闭时收到的“挂断”信号。

    >/dev/null 2>&1 重定向输出。这是必要的,因为在某些情况下,在收到输出之前不会将控制权交还给您的 python 脚本。

    要运行诸如“stress”和“vlc”之类的命令行应用程序并在您返回后保持它们运行,我发现的唯一解决方案是将您的命令放在 bash 脚本中,然后是 &&>/dev/null使用我在上一段中提到的方法使用 paramiko 调用该 bash 脚本。

    这似乎有点“hacky”,但这是我经过几天搜索后找到的唯一方法。

    【讨论】:

    • 这并不能真正回答这个问题,但是,我相信它为 ssh/linux 的工作原理提供了一些有用的见解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多