这个问题有一个小小的上下文:我正在创建一个应用程序,它在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”变量无效。
答案 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"'