Diferencia entre la invocación de openssl s_client en cron y en un terminal

Me gustaría supervisar banners de Microsoft Exchange.

Cuando estoy en la console, ejecuto el command:

timeout 1 openssl s_client -connect 192.168.0.5:995 > /tmp/1.txt 

Salida:

 tail -n 4 /tmp/1.txt: Timeout : 300 (sec) Verify return code: 0 (ok) --- +OK The Microsoft Exchange POP3 service is ready. 

Cuando agrego este command a cron, obtengo esta salida

 tail -n 4 /tmp/1.txt Start Time: 1488382801 Timeout : 300 (sec) Verify return code: 0 (ok) --- 

¿Cuál es la diferencia entre cron y console? Gracias.

Lo más probable es que, al ejecutar bajo cron , la connection se cerró antes de que el server remoto tuviera la oportunidad de emitir su banner. Esto se debe a que openssl s_client opera una connection bidireccional entre su stdio y el socket al server remoto:

  • Copia stdin al zócalo
  • Copia los datos recibidos en el socket a stdout

Cuando se ejecuta bajo cron , la primera copy termina inmediatamente, porque stdin está conectada a /dev/null . Esto hizo que openssl abandonara de inmediato.

Podría mitigar esto al networkingirigir la input de openssl a algo que bloquea para siempre, o mejor aún, algo como sleep 1 lo que obviará la necesidad de timeout de timeout .

Aún así, esperar un segundo es una forma particularmente frágil de conectarse y esperar un banner. No solo es un time de espera bastante corto, sino que ni siquiera hace que el command salga antes de la expiración del time de espera cuando se recibe el banner. Para algo como esto, estás buscando expect .


Por cierto:

Es probable que otros estén en desacuerdo, pero creo que su uso del término "console" en esta pregunta es inexacto. En realidad, obtendrías el comportamiento que describes por primera vez en cualquier session de la terminal, que podría ser, entre otras cosas ,:

  • una session de la terminal ssh,
  • un emulador de terminal (como xterm o los reemploops modernos) en su GUI
  • una window de screen ,
  • una connection de módem en serie,
  • o la console del sistema real.

Creo que el término "console" debe referirse exclusivamente al último, sin embargo, todas estas son sesiones terminales.

Cron utiliza un set mínimo de variables de entorno para sus trabajos. Y puede usar otras funciones que no uses en la console.

Puede usar which <programname> command which <programname> para ver la location de timeout y openssl cuando los usa en la console y también en cron.

También puede establecer la variable PATH al inicio de su script.