这个问题需要一点上下文:我正在制作一个应用程序,它可以在 python 中将文件/文件夹从一台机器复制到另一台机器。连接必须能够通过多台机器。我确实将机器串联连接,所以我必须跳过它们,直到找到正确的机器。
目前,我正在使用 python 的子进程模块(Popen)。作为一个非常简单的例子,我有
import subprocess
# need to set strict host checking to no since we connect to different
# machines over localhost
tunnel_string = "ssh -oStrictHostKeyChecking=no -L9999:127.0.0.1:9999 -ACt machine1 ssh -L9999:127.0.0.1:22 -ACt -N machineN"
proc = subprocess.Popen(tunnel_string.split())
# Do work, copy files etc. over ssh on localhost with port 9999
proc.terminate()
我的问题:当这样做时,我似乎无法让代理转发工作,这在这样的事情中是必不可少的。有没有办法做到这一点?
我尝试像这样在 Popen 中使用 shell=True 关键字
tunnel_string = "eval `ssh-agent` && ssh-add && ssh -oStrictHostKeyChecking=no -L9999:127.0.0.1:9999 -ACt machine1 ssh -L9999:127.0.0.1:22 -ACt -N machineN"
proc = subprocess.Popen(tunnel_string, shell=True)
# etc
这样做的问题是机器的名称是由用户输入给出的,这意味着它们可以很容易地注入恶意 shell 代码。第二个问题是我每次建立连接时都会运行一个新的 ssh-agent 进程。
我的 bashrc 中有一个很好的函数,它可以识别已经运行的 ssh-agents 并设置适当的环境变量并添加我的 ssh 密钥,但是当然子进程不能引用我的 bashrc 中定义的函数。我尝试在 Popen 中使用 shell=True 设置 executable="/bin/bash" 变量无济于事。