0

这个问题需要一点上下文:我正在制作一个应用程序,它可以在 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" 变量无济于事。

4

3 回答 3

0

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

于 2013-10-14T05:14:05.917 回答
0

你应该试试Fabric 。

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

下面的程序会给你一个测试运行。首先安装fabric,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然后您输入的每个命令都将在服务器上运行

于 2013-10-07T22:35:00.547 回答
0

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

我经常需要通过堡垒服务器进行隧道传输,并且我在~/.ssh/config文件中使用了类似的配置。只需更改主机名和用户名。这也假定您在 hosts ( /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"'

于 2021-02-04T13:56:26.833 回答