Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用代理在多台机器上进行Python ssh隧道_Python_Ssh_Tunnel_Ssh Tunnel - Fatal编程技术网

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

使用代理在多台机器上进行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

这个问题需要一点背景知识:我正在制作一个应用程序,用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
问题是机器的名称是由用户输入的,这意味着它们很容易注入恶意的外壳代码。第二个问题是,每次建立连接时都会运行一个新的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