Trabajo cron ejecutándose pero no estableciendo un túnel

Trabajo cron ejecutándose pero no estableciendo un túnel

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.shfunciona, 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 -Vescribe a stderry 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

información relacionada