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

Why are these python print lines indented? Context: port forwarding with ssh using python Popen

我有这段代码应该使用 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 这样它就不会从标准输入中读取。话虽如此,看起来您也可以完全在 Python 中使用 Fabric 库来完成此操作,特别是 Connection.forward_local().

奇怪的缩进行是由于 ssh 或远程 shell 更改了一些终端设置,其中之一是在发送到终端的换行符之前添加了回车符 returns。禁用时,每行将从上一行末尾的水平位置开始:

$ stty -onlcr; printf 'foo\nbar\nbaz\n'; stty onlcr
foo
   bar
      baz
         $