BandaAncha

  • 🔍 en 📰 artículos ⏎
  • 🔍 en 💬 foros ⏎
  • 🔍 en 👇 este 💬 foro ⏎
  • 🔍 en 👇 este 💬 tema ⏎
Regístrate Regístrate Identifícate Identifícate

Script expect para reiniciar HGU funciona en la línea de comandos pero no en cron

damosta1

Tengo un script hecho para automatizar el reinicio del HGU con el comando expect. El script es el siguiente:

!/usr/bin/expect -f
set timeout 2
spawn /usr/bin/ssh 1234@192.168.1.1
expect "password:"
send "XXXXXXXXXXXXXXXXXXXXXXX\r"
expect ">"
send "sys reboot\r"
expect ">"
send "exit\r"
expect_after timeout {puts "Timeout, exiting....";exit 0}
expect eof
exit

Lo tengo guardado en /usr/bin y le he dado los permisos correctos de ejecución. Si lo ejecuto en la línea de comandos poniendo solo HGU_reboot, que es como se llama el script, funciona perfectamente, se conecta al router y lo reinicia.

Si lo pongo en cron, no funciona. El comando en cron es: 00 5 */3 * * sudo HGU_reboot. Pero el resto de tareas que tengo sí que funcionan.

¿Alguna idea de cómo podría proceder? Lo quiero usar para que cada 3 días haga un reinicio del HGU Smart WiFi 6, porque parece que cuando lleva tiempo conectado empieza a funcionar no del todo correctamente.

lhacc

¿Qué dice el log de cron?

damosta1

Lo acabo de sacar:

marte@marte:/usr/bin$ grep CRON /var/log/syslog | tail -10
Mar 30 12:02:41 marte cron[1219]: (CRON) INFO (Running @reboot jobs)
Mar 30 12:02:41 marte CRON[1331]: (root) CMD (/usr/sbin/logrotate --state /var/lib/logrotate/pihole /etc/pihole/logrotate)
Mar 30 12:02:41 marte CRON[1332]: (root) CMD (   PATH="$PATH:/usr/sbin:/usr/local/bin/" pihole updatechecker reboot)
Mar 30 12:09:01 marte CRON[8351]: (root) CMD (  [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi)
Mar 30 12:17:01 marte CRON[8717]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Mar 30 12:24:19 marte cron[8964]: (CRON) INFO (pidfile fd = 3)
Mar 30 12:24:19 marte cron[8964]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
Mar 30 12:27:19 marte cron[9086]: (CRON) INFO (pidfile fd = 3)
Mar 30 12:27:19 marte cron[9086]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
Mar 30 12:28:01 marte CRON[9153]: (root) CMD (sudo HGU_reboot)

También he probado con cronitor shell y este es el log:

marte@marte:/usr/bin$ cronitor shell
~ $ HGU_reboot
spawn /usr/bin/ssh 1234@192.168.1.1
1234@192.168.1.1's password:
>sys reboot
>exit

Bye bye. Have a nice day!!!
Connection to 192.168.1.1 closed.

----► ✔ Command successful    Elapsed time 2.287s

marte@marte:/usr/bin$
🗨️ 4
lhacc
1

Prueba a añadir un poco de logging al propio script…

sudo HGU_reboot >> hgu.log 2>&1

🗨️ 3
damosta1

Vale, creo que ya se por donde van los tiros, esto es lo que me sale:

marte@marte:/tmp$ cat hgu.log
spawn /usr/bin/ssh 1234@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXX.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? XXXXXXXXXXXXXXXX PASSWORD
Please type 'yes', 'no' or the fingerprint: sys reboot
Please type 'yes', 'no' or the fingerprint: exit
Please type 'yes', 'no' or the fingerprint: Timeout, exiting....

La primera vez que lo ejecuté desde la línea de comandos me salió eso y validé el host, pero debe de ser que cuando se conecta el cron lo hace con otra llave.

🗨️ 2
damosta1

Solucionado! Gracias @lhacc

El script lo dejo de esta manera

!/usr/bin/expect

set verbose 0
set env(SHELL) /bin/bash
set env(HOME) /home/marte
set timeout 2
spawn ssh -o StrictHostKeyChecking=no 1234@192.168.1.1
expect "password:"
send "XXXX_CONTRASEÑA_XXXX\r"
expect ">"
send "sys uptime\r"
expect ">"
send "sys reboot\r"
expect ">"
send "exit\r"
expect_after timeout {puts "Timeout, exiting....";exit 0}
expect eof
exit

Y el cron:

00 05 */3 * * HGU_reboot >> /home/marte/Escritorio/hgu.log 2>&1

Para tener un registro del tiempo de funcionamiento y de cuando se reinicia el HGU.

Un saludo

rbetancor
3

No es que lo ejecute con otra llave … es que lo ejecuta con el usuario cron.

Tu problema, es que pensabas que si el script te funciona con el usuario con el que lo desarrollaste, te funcionará directo en el cron y no es así.

En la página del manual de cron , te explica como crear una entrada, para que se ejecute como un usuario concreto.