ssh-under-cron deja de funcionar en OS X 10.7 Lion

12

Acabo de actualizar Snow Leopard a Lion, y mis trabajos cron que usan ssh han dejado de funcionar. Parece que ssh-agent ya no funciona como se esperaba.

Aquí hay una versión detallada de mi script llamado desde el cron que funcionó muy bien en Snow Leopard:

#!/bin/bash
whoami # just to verify I'm running as myself, not root
ssh-agent # just to see what it outputs    
eval 'ssh-agent'
ssh -vvv REMOTESERVER ls

Cuando se ejecuta desde el símbolo del sistema, esta secuencia de comandos funciona como se esperaba.

Cuando se ejecuta desde cron, no funciona. La salida de ssh-agent parece normal:

SSH_AUTH_SOCK=/tmp/ssh-QRxPUMRxbu/agent.17147; export SSH_AUTH_SOCK;
SSH_AGENT_PID=17148; export SSH_AGENT_PID;
echo Agent pid 17148;
Agent pid 17150

Pero la salida ssh -vvv muestra que falla justo cuando se debe leer la clave privada:

debug1: Server accepts key: pkalg ssh-dss blen 818
debug2: input_userauth_pk_ok: fp ...
debug3: sign_and_send_pubkey: DSA ...
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: Device not configured
debug2: no passphrase given, try next key

En otras palabras, espera que escriba la frase de contraseña para ~/.ssh/id_dsa , que por supuesto no funciona en las tareas cron.

Todo esto funcionó en Snow Leopard.

Tenga en cuenta que tengo la configuración de Keychain Access para que ssh , ssh-agent y ssh-add puedan leer mi frase de contraseña para mi archivo .ssh/id_dsa ; como resultado, puedo SSH desde un indicador de terminal sin alguna vez tener que ingresar mi frase de contraseña.

¿Este problema que necesito para ejecutar ssh-add en algún momento de mi proceso de inicio de sesión? Ejecutarlo desde un indicador de bash estándar no ayuda a la tarea de cron (aunque, curiosamente, me pide mi frase de contraseña ... lo que creo que no es necesario para la configuración de Acceso a Llavero).

NOTA 1 - antes de redirigirme, soy consciente de que hay una pregunta similar aquí ( Mac OS X Lion y sshpass ) pero se trata específicamente de un programa sshpass que no uso (aunque creo que esta pregunta también sería respondida por éste).

NOTA 2 - Me doy cuenta de que las claves SSH sin frase de contraseña resolverían mi problema; sin embargo prefiero no ir por esta ruta.

    
pregunta John Hart 26.07.2011 - 20:32

4 respuestas

10

Para cualquiera que termine en esta página, me di cuenta de que debería publicar la respuesta:

El uso de launchd en lugar de cron de hecho soluciona el problema de autorización. Los trabajos de inicio de usuario (que se ejecutan solo cuando está conectado) utilizan correctamente la información del agente SSH que se desbloqueó a través de su llavero como parte del inicio de sesión (como parte de la administración de claves estándar de OS X, no se requiere ningún otro software).

Para minimizar mis interacciones con launchd, creé un solo trabajo launchd que llama a un script de bash. De esta manera, simplemente puedo editar el script sin tratar con launchd.

Aquí está el archivo launchd:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.mycron.hourly</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/john/bin/cron.hourly</string>
  </array>

  <key>Nice</key>
  <integer>1</integer>

  <key>StartInterval</key>
  <integer>3600</integer> <!-- start every X seconds -->

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Guardé el archivo en ~/Library/LaunchAgents/com.mycron.hourly.plist y luego lo cargué con:

launchctl load ~/Library/LaunchAgents/com.mycron.hourly.plist

Una vez cargado, se ejecutará de inmediato y luego nuevamente cada 60 minutos.

Si sigue el mismo procedimiento, deseará cambiar la cadena 'ProgramArguments' con la ruta correcta a su script.

    
respondido por el John Hart 19.07.2012 - 18:36
7

Agregar el siguiente código a tu script de shell bash solucionará el problema:

declare -x SSH_AUTH_SOCK=$( find /tmp/launch-*/Listeners -user your_user -type s | head -1 )

Reemplaza your_user con tu propio nombre de usuario.

Este código establece el valor correcto para SSH_AUTH_SOCK que informa a ssh o scp sobre cómo comunicarse con ssh-agent cuando el script de shell se inicia fuera de cron .

    
respondido por el Werner Antweiler 07.02.2012 - 19:33
1

Espero que la seguridad mejorada, como el espacio aislado y los cambios para mover aún más las cosas a 64 bits, esté causando un dolor inesperado.

No es una respuesta, per se, pero launchd está recibiendo todo el amor de Apple en estos días.

No está solucionando el problema del cron, pero es más estable y más personas pueden ayudarlo.

    
respondido por el bmike 26.07.2011 - 22:22
1

Para cualquiera que encuentre esto ahora, tratando de hacer que esto funcione en El Capitán, y aún reacio a convertir su trabajo cron de una línea en un script de lanzamiento, la respuesta de Werner Antweiler todavía funciona pero el camino cambió. Lo de abajo funcionó para mí:

declare -x SSH_AUTH_SOCK=$(find /var/folders/*/*/*/*/agent.* -user your_user -type s | head -1)

NOTA : ¡recuerda reemplazar tu_usuario con tu nombre de usuario!

No me dejaría enviar esto como un comentario sobre su respuesta ya que me falta la reputación, pero no quería dejarla sin actualizar esto, ya que definitivamente me ayudó a configurarlo.

Editar: 30 de marzo de 2016

Después de probar esto por un tiempo, debo agregar que esto solo funciona una vez que el agente se ha utilizado al menos una vez durante ese inicio de sesión. Iniciar una conexión ssh o ejecutar manualmente ssh-agent es suficiente para hacerlo. También se puede usar un script de inicio si desea que se ejecute automáticamente. Creé un startup.sh que solo ejecuta ssh-agent y luego usé el Editor de secuencias de comandos para guardar una .app con lo siguiente y agregué la aplicación resultante a mis elementos de inicio de sesión:

do shell script "/path/to/startup.sh"
    
respondido por el Petie 22.03.2016 - 12:43

Lea otras preguntas en las etiquetas