我在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()
答案 0 :(得分:27)
这确实是paramiko SSH exec_command(shell script) returns before completion的副本,但答案并不十分详细。所以......
正如您所注意到的,exec_command
是非阻止调用。因此,您必须使用以下任一方法等待远程命令的完成:
Channel.exit_status_ready
如果你想要对命令完成进行非阻塞检查(即:汇集)Channel.recv_exit_status
如果要阻止直到命令完成(并返回退出状态 - 退出状态为0表示正常完成)。在您的特定情况下,您需要后者:
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()
答案 1 :(得分:3)
除了做Sylvian Leroux建议的事情外:
如果你的命令涉及运行一个bash脚本,需要在paramiko关闭ssh会话后继续运行(每当你发送命令时),请使用:
nohup ./my_bash_script.sh >/dev/null 2>&1
。
nohup
告诉系统这个过程应该忽略"挂断" ssh会话结束时收到的信号。
>/dev/null 2>&1
重定向输出。这是必要的,因为在某些情况下,在收到输出之前,控件不会返回到python脚本。
运行命令行应用程序,例如" stress"和" vlc"并且在你返回后保持它们运行,我找到的唯一解决方案是将命令放在bash脚本中,后跟&
或&>/dev/null
,而不是使用我提到的方法调用bram脚本和paramiko上一段。
这似乎有点" hacky"但这是我经过几天搜索后找到的唯一方法。