如何使用Fabric通过同一服务器的两个不同端口进行SSH连接?

7 投票
1 回答
8023 浏览
提问于 2025-04-17 13:06

我正在尝试使用Fabric(版本1.3.4)在不同的服务器上配置Karaf实例。Karaf实现了一个SSH服务器。所以,我在同一台服务器上运行了两个SSH守护进程,一个在22端口,另一个在8101端口。通过Fabric的fabric.tasks.execute()方法,我可以连接到不同的主机和端口。

问题是,我的初始会话被第二个连接的用户接管了,因为似乎env.user被劫持了。

下面是一个简化的fabfile.py示例:

from fabric.api import env, run
from fabric.tasks import execute

env.hosts = ['192.168.5.250']

def firstSSH():
        run("echo first")
        executeHosts = []
        for host in env.hosts:
                executeHosts.append("notmmaley@" + host + ":8101")
        execute(secondSSH, hosts=executeHosts)
        run("echo first again")

def secondSSH():
    run("echo second", shell=False, pty=False)

这两个SSH服务器在同一台服务器上,使用两个不同的端口,并允许两个不同的用户。以下是输出结果:

~/fabric$ fab firstSSH
[192.168.5.250] Executing task 'firstSSH'
[192.168.5.250] run: echo first
[192.168.5.250] Login password:
[192.168.5.250] out: first

[notmmaley@192.168.5.250:8101] Executing task 'secondSSH'
[notmmaley@192.168.5.250:8101] run: echo second
[notmmaley@192.168.5.250:8101] Login password:
[notmmaley@192.168.5.250:8101] out: second

[notmmaley@192.168.5.250:8101] run: echo first again

Done.
Disconnecting from 192.168.5.250:8101... done.
Disconnecting from mmaley@192.168.5.250... done.

注意到“echo first again”是以notmmaley用户的身份执行的,而这个用户是专门为execute()命令的主机指定的。我想要的是execute()命令在指定的user@host:port下以指定用户的身份执行,然后再把原来的用户返回给我,以便进行后续的任务。这在Fabric/execute()中可能实现吗?我哪里出错了?

1 个回答

5

我认为这是在 Bug 568 中提到的问题,这个问题在 Fabric 1.4.1 及以上版本中已经修复。你应该更新到最新版本,看看是否能解决你的问题。顺便提一下,你在处理主机操作时,可能会更好地使用以下方式:

execute(secondSSH, hosts=["notmmaley@%s:8101" % h for h in env.hosts])

因为你没有创建任何变量,也没有简单的循环来填充它们。

撰写回答