Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
等待直到通过Python在远程计算机上完成任务_Python_Python 2.7_Ssh_Remote Access_Paramiko - Fatal编程技术网

等待直到通过Python在远程计算机上完成任务

等待直到通过Python在远程计算机上完成任务,python,python-2.7,ssh,remote-access,paramiko,Python,Python 2.7,Ssh,Remote Access,Paramiko,我正在Ubuntu上用python编写一个程序。在那个程序中,我试图在连接到网络的远程机器(RaspberryPi)上完成“删除文件”任务后打印一条消息 但在实际操作中,打印命令并不是等待远程机器上的任务完成 有人能告诉我怎么做吗? 我的代码如下 import paramiko # Connection with remote machine client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.Au

我正在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()

这确实是一个复制品,但答案并不十分详细。所以

正如您所注意到的,
exec\u命令
是一个非阻塞调用。因此,您必须使用以下任一方法等待远程命令完成:

  • 如果希望对命令完成情况进行非阻塞检查(即:池)
  • 如果要阻止,直到命令完成(并返回退出状态-退出状态为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()

除了做Sylvian Leroux建议的事情外:

如果您的命令涉及在paramiko关闭ssh会话后(每次发送命令时)运行需要保持运行的bash脚本,请使用:

nohup./my\u bash\u script.sh>/dev/null 2>&1

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

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

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


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

这并不能真正回答问题,但是,我相信它提供了一些关于ssh/linux如何工作的有用见解。答案原则上是正确的。但实际实现不能这么简单,因为如果命令输出足够大,就会死锁。看见