Tengo un script que establece un túnel inverso en un punto final HostB
. Se parece a esto:
cat tun.sh
#!/usr/bin/env bash
# Test code
/usr/bin/ssh -V 1> /home/userA/bin/tun.stdout 2> /home/userA/bin/tun.stderr
# Establish tunnel
createTunnel() {
/usr/bin/ssh -R *:19999:localhost:22 userB@hostB
}
# Do nothing if tunnel is already established
/usr/bin/ssh -p 19999 userA@hostB true
if [[ $? -ne 0 ]]; then
createTunnel
fi
cuando lo ejecuto manualmente como ./tun.sh
funciona, y puedo ver en HostB, que el usuarioA ha iniciado sesión. Si lo ejecuto nuevamente en HostA pero desde otra consola, funciona como se esperaba: no inicia un segundo túnel.
Todo hasta ahora está bien.
Ahora edito mi crontab para que se vea así:
crontab -l
# m h dom mon dow command
*/1 * * * * /home/userA/bin/tun.sh
Ejecuta el script cada minuto. Esto debería estar bien, ya que el script finaliza si el túnel ya está establecido.
Sin embargo, ahora el usuarioA no inicia sesión como cuando lo ejecuto manualmente desde la consola.
El código de prueba en la parte superior del script confirma que se está llamando al script y que tiene permiso para ejecutarse /usr/bin/ssh
:
~/bin$ ls
tun.sh tun.stderr tun.stdout
~/bin$ cat tun.stderr
OpenSSH_5.3p1 Debian-3ubuntu7, OpenSSL 0.9.8k 25 Mar 2009
~/bin$ cat tun.stdout
[empty]
Por alguna razón -V
escribe a stderr
y no stdout
, pero eso es un detalle. El punto principal aquí es que el script se ejecuta cada minuto.
Mi pregunta es:¿Por qué no está establecido el túnel SSH?
Respuesta1
Gracias a @Andrew por señalar ssh-agent
. Por lo que puedo ver, si uno quiere poder establecer el túnel sin tener que ingresar una contraseña cada vez, la contraseña debe almacenarse o eliminarse. Elegí eliminarlo. Para que conste, aquí hay algunas limpiezas basadas en los comentarios que recibí:
#!/usr/bin/env bash
# Establish tunnel
createTunnel() {
/usr/bin/ssh -i /home/laptopuser/.ssh/id_rsa_tunnel -R 2200:localhost:22 [email protected]
}
# Do nothing if tunnel is already established
/usr/bin/ssh -i /home/user/laptopuser/.ssh/id_rsa_tunnel -p 2200 [email protected] true
if [[ $? -ne 0 ]]; then
createTunnel
fi
crontab:
# m h dom mon dow command
*/1 * * * * /home/laptopuser/bin/establishTunnel.sh
copie su identificación de túnel al vps:
ssh-copy-id -i /home/user/laptopuser/.ssh/id_rsa_tunnel vps.com
Espere hasta que el túnel se esté ejecutando (ver sudo watch grep CRON /var/log/syslog
) y copie su identificación normal si aún no ha ingresado.~/.ssh/authorized_keys
ssh-copy-id vps.com -p 2200
Lo ideal sería que el túnel se ejecutara como usuario dedicado tanto en el vps como en la computadora portátil.
Respuesta2
Tuve un problema similar: el túnel ssh funciona si se ejecuta desde un script pero no desde crontab. ssh busca claves y hosts_conocidos en $HOME/.ssh. Si está ejecutando el script desde bash con el usuario tom, $HOME será /home/tom. Si el script se ejecuta desde crontab, el usuario será root y $HOME será /home/root (o indefinido).
Solución: Defina INICIO en su secuencia de comandos para el usuario que tiene las claves.
HOME=/home/tom