无法真正将SSH隧道在Fabric和nohup中后台运行

3 投票
1 回答
1336 浏览
提问于 2025-04-17 07:21

我似乎无法让Fabric和我用nohup命令后台运行的进程配合得很好……根据一些信息,这应该是可行的,包括这里这里

def test():
h = 'xxxxx.compute-1.amazonaws.com'    
ports = [16646, 9090, 6666]

with settings(host_string = h):
    tun_s = "ssh  -o StrictHostKeyChecking=no -i ~/.ssh/kp.pem %s@%s " % (env.user, h)      

    for port in ports:
        p_forward = "-L %d:localhost:%d" % (port, port)
        tun_s = "%s %s" % (tun_s, p_forward)

    tun_s = "%s -N" % tun_s
    # create the tunnel. . .
    print "creating tunnel %s" % tun_s
    run("nohup '%s' >& /dev/null < /dev/null &" % tun_s)
    print "fin"

简化的输出:

ubuntu@domU-xxx:~/deploy$ fab test
executing on tunnel ssh  -o StrictHostKeyChecking=no -i ~/.ssh/kp.pem ubuntu@xxx  -L 16646:localhost:16646 -L 9090:localhost:9090 -L 6666:localhost:6666 -N
[xxx.compute-1.amazonaws.com] run: nohup 'ssh  -o StrictHostKeyChecking=no -i ~/.ssh/kp.pem ubuntu@xxx.compute-1.amazonaws.com  -L 16646:localhost:16646 -L 9090:localhost:9090 -L 6666:localhost:6666 -N' >& /dev/null < /dev/null &
fin

Done.
Disconnecting from xxxx

我知道隧道命令本身没有问题,因为如果我去掉nohup的部分,它就能正常工作(但显然Fabric会卡住)。我很确定它没有正确地分离,当run函数返回时,隧道进程就立刻结束了。

但这是为什么呢?

在我代码的另一个部分,使用python命令时也会发生这种情况。

1 个回答

0

看起来经过一番折腾,我发现我的设置(在EC2实例上默认安装的Ubuntu)似乎无法做到这一点,不知道为什么,但根据不同的来源来看,这似乎是可能的。

我通过使用Paramiko替代Fabric,解决了我特定的问题,这样可以让需要在后台运行的调用继续进行。下面的代码实现了这个功能:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
privkey = paramiko.RSAKey.from_private_key_file('xxx.pem')
ssh.connect('xxx.compute-1.amazonaws.com', username='ubuntu', pkey=privkey)
stdin, stdout, stderr = ssh.exec_command("nohup ssh  -f -o StrictHostKeyChecking=no -i     ~/.ssh/xxx.pem ubuntu@xxx.compute-1.amazonaws.com -L 16646:localhost:16646 -L -N >& /dev/null < /dev/null &")
ssh.close()

撰写回答