使用Popen在Python中持久的ssh会话

时间:2013-11-06 22:04:53

标签: python ssh

我正在使用python创建一个电影控制器(Pause / Stop ...),我将其发送到远程计算机,并将命令发送到命名管道中,如此

echo -n q > ~/pipes/pipename

我知道如果我通过终端ssh并自己做,这是有效的,所以命名管道重定向的设置没有问题。我的问题是设置一个ssh会话需要时间(1-3秒),而我希望暂停命令是瞬时的。因此,我想到设置一个像这样的持久管道:

controller = subprocess.Popen ( "ssh -T -x <hostname>", shell = True, close_fds = True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE )

然后向它发出命令

controller.stdin.write ( 'echo -n q > ~/pipes/pipename' )

我认为问题是ssh是交互式的,所以它期望回车。这就是我的问题开始的地方,几乎所有提出这个问题的人都被告知使用现有的模块:

哪个好,但我很亲密。我只需要知道如何包含回车,否则,我必须去学习所有这些其他模块,这些模块并不重要(例如,现在我无法弄清楚pexpect如何使用我的{{1文件或我的ssh无密钥身份验证)。

2 个答案:

答案 0 :(得分:1)

我不确定为什么它没有像你设置的那样工作,但是我会对此进行一次尝试。我想我会做的是将Popen调用更改为:

controller = subprocess.Popen("ssh -T -x <hostname> \"sh -c 'cat > ~/pipes/pipename'\"", ...

然后只需controller.stdin.write('q')

答案 1 :(得分:1)

要为命令添加换行符,您需要在字符串中添加换行符:

controller.stdin.write('\n')

您可能还需要冲洗管道:

controller.stdin.flush()

当然,控制器必须准备好接收新数据,否则你可能会永远阻止尝试发送数据。 (如果它没有准备好的原因是它永远阻止等待你从它的stdout读取,这在某些平台上是可能的,你就无法恢复死锁。)