我有这段应该使用subprocess的代码。Popen在后台转发一些端口。它给出了出乎意料的缩进打印语句——知道这里出了什么问题吗?
如果你有更好的python端口转发(在后台)的方法,我洗耳恭听!我刚刚打开了另一个终端并运行SSH命令,但肯定有一种方法可以通过编程来实现,对吗?
代码:
import subprocess
print("connecting")
proc = subprocess.Popen(
["ssh", f"-L10005:[IP]:10121",
f"[USERNAME]@[ANOTHER IP]"],
stdout=subprocess.PIPE
)
for _ in range(100):
realtime_output = str(proc.stdout.readline(), "utf-8")
if "[IP]" in realtime_output:
print("connected")
break
... other code that uses the forwarded ports
print("terminating")
proc.terminate()
期望行为(正常打印行):
$ python test.py
connecting
connected
terminating
实际行为(古怪的打印行):
$ python test.py
connecting
connected
terminating
$ [next prompt is here for some reason?]
这可能是因为ssh在远程机器上打开了一个完整的shell(如果您键入一些命令,它们可能会远程运行!)。你应该通过传递-N
来禁用它,这样它就不会运行任何东西。如果你不需要在ssh中输入任何东西(例如输入密码或确认主机密钥),你也可以传递-n
,这样它就不会从stdin中读取。话虽如此,看起来您也可以完全在Python中使用Fabric库,特别是Connection.forward_local()
来完成此操作。
缩进行奇怪是由于ssh或远程shell更改了一些终端设置,其中一个更改在发送到终端的换行符之前添加了回车。当禁用此选项时,每行将从前一行末尾的水平位置开始:
$ stty -onlcr; printf 'foonbarnbazn'; stty onlcr
foo
bar
baz
$