为什么这些 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
$
我有这段代码应该使用 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
$