2012-02-16 27 views
7

我正尝试使用Fabric(v1.3.4)在各种服务器上配置Karaf实例。 Karaf实现一个SSH服务器。所以,我有两个ssh守护进程在同一台服务器上运行;一个在端口22上,另一个在8101上。使用Fabric的fabric.tasks.execute()方法,我可以连接到另一个主机:端口。如何使用Fabric将SSH连接到同一台服务器上的两个不同端口?

问题是,由于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("[email protected]" + 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 

[[email protected]:8101] Executing task 'secondSSH' 
[[email protected]:8101] run: echo second 
[[email protected]:8101] Login password: 
[[email protected]:8101] out: second 

[[email protected]:8101] run: echo first again 

Done. 
Disconnecting from 192.168.5.250:8101... done. 
Disconnecting from [email protected] done. 

注意如何“再次回声第一”为这是严格地指定了执行()命令的主机notmmaley用户被执行。我想(需要)执行()命令以指定的用户@主机:端口以指定用户身份发生,然后将原始用户返回给我以执行其余任务。这可能与Fabric/execute()和/或我哪里出错了?

回答

5

我认为这是一个在Bug 568中解决的问题,它在Fabric 1.4.1+中进行了修补。你应该更新到最新的,看看这是否解决你的问题。在一个侧面说明,你可能会被这样为你的主机操作得到更好的服务:

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

如果你还没有做任何增值经销商,或简单的for循环来填充他们。

+0

感谢您提供该错误参考的链接。我一直与bitprophet联系,重申这种行为是由于一个预期的特性。它看起来像修复可能提供的解决方案,我会尝试。也感谢关于如何加强代码的建议。我是Python的新手,所以这非常有帮助! – mmaley 2012-04-29 21:10:09

相关问题