无法使用织物和NOHUP真正背景SSH隧道
题
我似乎无法让面料在背景过程中发挥好作用,使我使用了我使用的过程。 。 。给定各种信息,包括 这里 和 这里.
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
我知道隧道命令本身没有问题,因为如果我剥去了湿气的东西,它可以正常工作(但显然悬挂着织物)。我很确定它不会正确地分离,并且当运行功能返回时,隧道过程立即死亡。
但为什么?
这也是我代码另一部分中的Python命令发生的。
解决方案
因此,似乎在我的设置中出于何种原因而无法出于纠纷(默认的Ubuntu在EC2实例上安装),这似乎是不可能的。根据各种来源,我不知道为什么和似乎可能。
我通过使用解决了我的特定问题 Paramiko 代替面料,需要在后台运行的呼叫。以下实现了这一点:
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()
不隶属于 StackOverflow