使用代理在多台机器上进行Python ssh隧道
这个问题需要一点背景知识:我正在制作一个应用程序,用python将文件/文件夹从一台机器复制到另一台机器。连接必须能够通过多台机器。我真的把机器连在一起了,所以我必须跳过它们,直到找到正确的机器 目前,我正在使用python的模块(Popen)。我举了一个非常简单的例子使用代理在多台机器上进行Python ssh隧道,python,ssh,tunnel,ssh-tunnel,Python,Ssh,Tunnel,Ssh Tunnel,这个问题需要一点背景知识:我正在制作一个应用程序,用python将文件/文件夹从一台机器复制到另一台机器。连接必须能够通过多台机器。我真的把机器连在一起了,所以我必须跳过它们,直到找到正确的机器 目前,我正在使用python的模块(Popen)。我举了一个非常简单的例子 import subprocess # need to set strict host checking to no since we connect to different # machines over localhos
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
问题是机器的名称是由用户输入的,这意味着它们很容易注入恶意的外壳代码。第二个问题是,每次建立连接时都会运行一个新的ssh代理进程
我的bashrc中有一个很好的函数,它标识已经运行的ssh代理,设置适当的环境变量,并添加ssh密钥,但是cource子进程的函数不能引用bashrc中定义的函数。我尝试在Popen中使用shell=True设置可执行文件=“/bin/bash”变量,但没有效果。您应该试试
它提供了一套用于执行本地或远程操作的基本操作
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')
更改到包含fab文件的目录并运行
fab run\u interactive
,然后您输入的每个命令都将在服务器上运行我测试了您的第一个简单示例,代理转发工作正常。我所能看到的唯一可能导致问题的想法是,在执行脚本的shell中没有正确设置环境变量SSH\u AGENT\u PID和SSH\u AUTH\u SOCK。您可以使用ssh-v更好地了解故障发生的位置。尝试设置ssh配置文件:
我经常需要通过bastion服务器进行隧道传输,并且在我的~/.ssh/config
文件中使用类似的配置。只需更改主机名和用户名。这还假定您的主机(/etc/hosts
)文件中有这些主机名的条目
然后,我使用如下语法获得访问权限:ssh我的堡垒服务器-在“ssh我的目标主机-在”
我对我的目标主机发出命令,比如:ssh我的堡垒服务器-在“ssh我的目标主机-在“ls-la”上”
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