Incapaz de hacer un fondo realmente un túnel SSH usando tela y nohup
Pregunta
Parece que no puedo hacer que la tela juegue bien con el fondo de un proceso en el que he usado Nohup. . . Debe ser posible, dada varias piezas de información, incluida aquí y aquí.
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"
Salida abreviada:
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
Sé que no hay problema con el comando del túnel per se porque si me quito las cosas de nohup, funciona bien (pero obviamente cuelga de la tela). Estoy bastante seguro de que no se está separando correctamente y cuando la función de ejecución devuelve el proceso del túnel está muriendo inmediatamente.
¿Pero por qué?
Esto también sucede con un comando de Python en otra parte de mi código.
Solución
Por lo tanto, después de mucha disputa, esto no es posible por cualquier razón con mi configuración (Ubuntu predeterminado se instala en instancias EC2). No tengo idea de por qué y como parece posible según varias fuentes.
Solucioné mi problema particular usando Paramiko en lugar de tela, para las llamadas que deben dejarse en funcionamiento en segundo plano. Lo siguiente logra esto:
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()