无法真正将SSH隧道在Fabric和nohup中后台运行
我似乎无法让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()