为什么这些python打印行缩进?上下文:使用python Popen进行ssh端口转发



我有这段应该使用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
$

相关内容

  • 没有找到相关文章

最新更新