Tengo una PC detrás de un NAT que hace una conexión SSH inversa a mi VPC Digitalocean. Utilizo esta conexión SSH invertida desde casa para iniciar sesión en la PC de mi oficina (estoy autorizado para hacerlo) y copiar archivos y hacer otras cosas importantes.
Aunque no con frecuencia, noté que mi PC de oficina se reinicia (debido a fallas de energía, etc.) y rompe la conexión SSH invertida que ha hecho con mi VPC. En este tipo de casos, no puedo conectarme desde la PC de mi casa a la PC de mi oficina.
Ejecuto el siguiente script para hacer la conexión inversa + proxy dinámico para anonimizar mi tráfico (ya que no estoy obligado a compartir información de navegación) generado en la PC de la oficina.
autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
No hay forma de que pueda ejecutar este script nuevamente en mi PC de la oficina al reiniciar, ya que no estoy físicamente allí. Para resolver este problema instalé el siguiente crontab.
Nota: el rev.sh
archivo contiene la línea anterior. El certificado "digitalOcean" y rev.sh se encuentra en Ubuntu home
. Por lo tanto, cuando ejecuto ./rev.sh
en mi terminal Ubuntu obtengo un proxy dinámico y también accedo al servidor ym DigitalOcean. Este método funciona al 100%.
Sin embargo, cuando instalo el crontab con el siguiente método, Mi PC ubuntu nunca crea un proxy dinámico. Puedo ver esto porque cuando reviso este proxy de Google Chrome, dice que el proxy rechaza la conexión.
Aquí están los trabajos de cronejo que probé como trabajo de raíces También probé estos como un usuario normal, aún así no funcionaron.
@reboot bash /home/user/rev.sh
@reboot /home/user/rev.sh
@reboot cd /home/user && ./rev.sh
Luego instalé un crontab varios minutos antes de la hora actual y esperé a que se ejecutara.
24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh
estos tampoco se ejecutaron.
Por favor, tenga la amabilidad de ayudarme a detectar mi error. Hay muchas preguntas similares en este sitio web sobre mi problema. He referido muchas respuestas por lo tanto, pero ninguna de ellas parecía ayudar.
fuente
/var/log/cron*
. Para fines de prueba, simplemente podría escribir algo como*/2 * * * * /path/to/script
: ejecutará un script cada 2 minutos. También verifique si hay correos para el usuario que ejecuta cron. ¿Es root? Usa elmail
comando. Oh, puedo ver que estás usando la clave ssh? Dudo que cron job pueda encontrarlo si no le das una ruta completa después del-i
cambio.Respuestas:
No estoy seguro de si usar
cron
para ejecutar un script al inicio es una buena idea. Una alternativa que veo más adecuada es crear un servicio SystemD, como se describe aquí . Crea un archivo llamado/etc/systemd/system/autossh.service
:Luego ejecute el siguiente comando como root:
fuente
Un par de cosas que puedes probar:
A veces su ruta no está completamente configurada en el momento del arranque o a través de cronjobs, así que reemplace autossh con la ruta completa, en mi sistema que es
El motivo @reboot depende del tiempo de inicio del cron daemon, por lo tanto, puede invocarse antes de que otros subsistemas (¿red?) estén en funcionamiento
Y tu ejemplo de crontab:
solo invocará el día 8 de cada mes. Y tiene un campo extra. Tratar
fuente
/usr/bin
siempre está en el valor predeterminadoPATH
, incluso paracron
Parece ser que cuando el script se ejecuta a través de crontab no puede encontrar su certificado.
Cuando usted, como usuario, ejecuta el script, utiliza el certificado de /home/ubuntu-user/.ssh / ... Sin embargo, cuando el script se ejecuta desde crontab, se ejecuta como root. root toma los certificados de /root/.ssh
Entonces, tiene varias formas de hacerlo funcionar, pero creo que ejecutar el script como lo hace ubuntu-user en crontab .
Editar:
asegúrese de proporcionar una ruta completa calificada para el certificado
fuente
Intenta usar
su
:¿Te ayudará con tu problema?
fuente
Como la pregunta no contiene tantos datos, comenzaré desde cero con lo que haría
Pondría todas las configuraciones en / etc / ssh / ssh_config:
Pondría la llave
/etc/ssh/mytunnel_key
entonces intentaría con una entrada cron (un servicio upstart / systemd sería mejor) como este:
fuente
Debe usar -f y ejecutar un comando cuando se ejecuta sin un terminal. Así que aquí hay un ejemplo:
-f lo coloca en segundo plano, pero colocarlo en segundo plano significa que ssh se conectará y luego se desconectará tan pronto como haya completado su tarea. Entonces necesitas una tarea.
sleep 31536000 le dice a ssh que ejecute "sleep" durante 1 año después de conectarse. Durante este tiempo, tus túneles permanecerán arriba.
Si no ejecuta un comando, ssh se conectará, configurará el túnel inverso en el puerto 2205, y cuando termine con eso, saldrá. Usando autossh, si la conexión falla, se volverá a conectar y reiniciará la suspensión nuevamente. Incluso con una conexión a Internet realmente estable, dudo que sea posible un año.
Por cierto, a diferencia de estos otros comodines, sé que esto funciona, ya que en realidad lo probé porque, por supuesto, estoy haciendo algo similar y como lo tengo funcionando ahora, de manera muy confiable, puedo darle la respuesta correcta.
-f y "comando"
Eso es lo que te estás perdiendo.
fuente