Python ssh使用代理在多台机器上进行隧道传输

时间:2013-10-07 22:07:05

标签: python ssh tunnel ssh-tunnel

这个问题有一个小小的上下文:我正在创建一个应用程序,它在python中将文件/文件夹从一台机器复制到另一台机器。连接必须能够通过多台机器。我确实将机器连接起来in serial所以我必须跳过它们直到找到正确的机器。

目前,我正在使用python的subprocess模块(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密钥,但是cource子进程不能引用我的bashrc中定义的函数。我尝试在Popen中使用shell = True设置executable =“/ bin / bash”变量无效。

3 个答案:

答案 0 :(得分:0)

您应该尝试Fabric

  

它提供了执行本地或远程的基本操作套件   shell命令(通常或通过sudo)和上传/下载文件,   以及辅助功能,例如提示正在运行的用户   用于输入或中止执行。

下面的程序将为您提供测试运行。 首先使用pip install fabric安装结构,然后将代码保存在fabfile.py

from fabric.api import *

env.hosts = ['server url/IP'] #change to ur server.
env.user = #username for the server
env.password = #password

def run_interactive():
    with settings(warn_only = True)
    cmd = 'clear'
    while cmd is not 'stop fabric':
        run(cmd)
        cmd = raw_input('Command to run on server')

切换到包含fabfile的目录并运行fab run_interactive,然后输入的每个命令都将在服务器上运行

答案 1 :(得分:0)

我测试了您的第一个简单示例,并且代理转发工作正常。我认为可能导致问题的唯一想法是在执行脚本的shell中未正确设置环境变量SSH_AGENT_PID和SSH_AUTH_SOCK。您可以使用ssh -v更好地了解事情的发生地点。

答案 2 :(得分:0)

尝试设置 SSH 配置文件:https://linuxize.com/post/using-the-ssh-config-file/

我经常需要通过堡垒服务器进行隧道传输,我在 ~/.ssh/config 文件中使用了这样的配置。只需更改主机名和用户名即可。这还假定您的主机 (/etc/hosts) 文件中有这些主机名的条目。

Host my-bastion-server
        Hostname my-bastion-server
        User user123
        AddKeysToAgent yes
        UseKeychain yes
        ForwardAgent yes

Host my-target-host
        HostName my-target-host
        User user123
        AddKeysToAgent yes
        UseKeychain yes

然后我使用以下语法获得访问权限:
ssh my-bastion-server -At 'ssh my-target-host -At'

然后我针对 my-target-host 发出命令,例如:
ssh my-bastion-server -AT 'ssh my-target-host -AT "ls -la"'