Python通过ssh

时间:2017-06-16 12:50:11

标签: python linux ssh

我正在尝试通过ssh终止进程。 现在,当直接终止进程时,请参阅 init 中注释掉的行,进程将在远程主机上终止。 当然,我不想立即终止,而是在最后终止所有远程进程。

取决于选项' -t'在subprocess.Popen中,当我尝试在示例结尾的循环中终止时,会出现不同的结果:

如果' -t'如果设置,则流程终止。

如果' -t'设置,进程终止,但我的终端隐藏任何输入,任何输入移动输入线。

现在,为什么没有' -t'选项,进程在结束处的循环处终止?

serverThreads = []
serverscripts = []
serverscripts.append("script1")
serverscripts.append("script2")

class ServerCaller(threading.Thread):
def __init__(self, script):
    threading.Thread.__init__(self)
    self.script = script
    self.ssh = subprocess.Popen(["ssh", '-t' , username + dataServer, self.script])
    #if I terminate here without '-t' the process on the remote Host is terminated
    #self.term()
def term(self):
    self.ssh.terminate()

for ss in serverscripts:
    serverThreads.append(ServerCaller(ss))

#if I terminate here without '-t' the process on the remote Host is NOT terminated
#if I terminate here with '-t' the process on the remote Host is terminated,
#but my terminal is screwed up
for t in serverThreads:
    t.term()

1 个答案:

答案 0 :(得分:0)

当您使用ssh在远程系统上调用命令,并使用-t为远程命令请求TTY时,远程ssh服务器将分配TTY并启动远程使用TTY作为控制TTY的命令。

当您使用ssh调用没有TTY的远程命令时,远程SSH服务器将创建一组管道并使用这些管道作为命令的标准输入,输出启动远程命令和错误。

终止本地ssh实例时,将关闭与服务器的SSH连接。发生这种情况时,远程服务器不会显式尝试终止您之前启动的远程进程。远程服务器只是关闭与远程进程的连接--TTY或管道集。

如果使用TTY启动远程进程(因为您指定了-t),则关闭TTY将导致远程进程接收SIGHUP信号。 SIGHUP将导致进程终止,除非该进程专门安排捕获或忽略该信号。

如果远程进程在没有TTY的情况下启动,则关闭进程的标准输入/输出/错误不会立即生效。该过程不会收到SIGHUP或其他信号。如果进程尝试从标准输入读取,则它将获得文件结束条件。如果它试图写入stdout / stderr,它将获得一个SIGPIPE。如果它没有访问stdin / stdout / stderr,那么这些都不会发生,并且该过程可以无限期地继续运行。