Python中使用Popen的持久ssh会话

2024-09-30 01:29:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python创建一个电影控制器(Pause/Stop…),通过ssh连接到远程计算机,然后将命令发送到一个命名管道中,如下所示

echo -n q > ~/pipes/pipename

我知道,如果我通过终端ssh并自己执行,那么就不会有命名管道重定向的设置问题。我的问题是设置ssh会话需要时间(1-3秒),而我希望pause命令是即时的。因此,我想设置一个持久管道,如下所示:

^{pr2}$

然后像这样对它发出命令

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

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

很好,但我离得太近了。我只需要知道如何包含回车符,否则,我必须学习所有其他模块,这对您来说并不简单(例如,现在我无法理解pexpect如何使用我的/etc/hosts文件或ssh无密钥身份验证)。在


Tags: 模块answer命令echo远程电影管道计算机
2条回答

要向命令中添加新行,需要向字符串添加新行:

controller.stdin.write('\n')

您可能还需要冲洗管道:

^{pr2}$

当然,控制器必须准备好接收新数据,否则您可能会永远阻止尝试向其发送数据。(如果它没有准备好的原因是它一直在阻塞,等待您从它的stdout读取,这在某些平台上是可能的,那么您就无法恢复地陷入僵局了。)

我不知道为什么它不能像你所设置的那样工作,但我要试试看。我想我应该把Popen调用改为:

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

然后简单地controller.stdin.write('q')。在

相关问题 更多 >

    热门问题