我想使用子进程模块来控制通过ssh生成的一些进程。
通过搜索和测试,我发现这有效:
import subprocess
import os
import time
node = 'guest@localhost'
my_cmd = ['sleep','1000']
devnull = open(os.devnull, 'wb')
cmd = ['ssh', '-t', '-t', node] + my_cmd
p = subprocess.Popen(cmd, stderr=devnull, stdout=devnull)
while True:
time.sleep(1)
print 'Normal output'
我提供的-t -t选项允许我终止远程进程而不仅仅是ssh命令。但是,这也会扰乱我的程序输出,因为换行符不再有效,使得它成为一个冗长且难以阅读的字符串。
如何使ssh不影响python程序的格式?
示例输出:
guest:~$ python2 test.py
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
(First ctrl-c)
Normal output
Normal output
Normal output
(Second ctrl-c)
^CTraceback (most recent call last):
File "test.py", line 13, in <module>
time.sleep(1)
KeyboardInterrupt
答案 0 :(得分:2)
好的,输出现在已经清楚了。我不知道为什么,但命令<input name="return" type="hidden" id="Hidden1" value="@MyClass.Domain.Common.WebAppSettings.AspxOldUrl/Thanks.aspx" />
<input type="hidden" name="cancel_return" value="@MyClass.Domain.Common.WebAppSettings.AspxOldUrl/Cancellation.aspx" />
<input type="hidden" name="notify_url" value="@MyClass.Domain.Common.WebAppSettings.AspxOldUrl/ThankYou.aspx" />
将本地终端置于原始模式。无论如何它都是有意义的,因为它旨在允许你在遥控器上直接使用curses程序(例如vi),在这种情况下,不应该进行任何转换,即使是简单的ssh -t -t
- > \n
允许使用简单的新行将光标留在第一列。但我在ssh文档中找不到对此的引用。
它(\r\n
)允许您终止远程进程,因为原始模式允许将 Ctrl + C 发送到远程进程,而不是由本地tty驱动程序处理。
恕我直言,这是设计气味,因为你只使用pty分配的副作用将 Ctrl + C 传递给遥控器而你又遭受了另一面的痛苦效果是本地系统的原始模式。您应该在本地键盘上输入特殊字符时处理标准输入(-t -t
)并明确发送stdinput = subprocess.PIPE
,或者为执行此操作的SIG-INT安装信号处理程序。
或者,作为一种变通方法,您可以在启动远程命令后以简单的方式使用chr(3)
(或更好的子进程等效项),以便以可接受的模式重置本地终端。