13 votos

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

Actualizado sólo de Snow Leopard a Lion, y mi cron puestos de trabajo que usar ssh han dejado de funcionar. Parece que el ssh-agent ya no funciona como se esperaba.

He aquí un bowdlerized versión de mi llamada-de-script cron que funcionó bajo 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, este script funciona como se esperaba.

Cuando se ejecuta desde cron, no funciona. El ssh-agent de salida 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 ssh -vvv resultado muestra que se produce justo cuando la clave privada debe ser leído:

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, esperando que me escriba la frase de contraseña de ~/.ssh/id_dsa, que por supuesto no funciona en cron puestos de trabajo.

Todo esto trabajado en Snow Leopard.

Tenga en cuenta que tengo Acceso a llaves de la instalación para que ssh, ssh-agenty ssh-add pueden leer mi contraseña de mi .ssh/id_dsa archivo - como resultado puedo SSH desde una ventana de terminal sin tener que introducir mi contraseña.

Este asunto es que necesito ejecutar ssh-add en algún momento de mi proceso de inicio de sesión? Ejecución de un estándar de bash no ayuda a la tarea en el cron (aunque, curiosamente, lo hace preguntarme por mi contraseña ... que yo creo que no es necesario b/c de las llaves de Acceso de configuración).

NOTA 1 - antes de redireccionar a mí - soy consciente de que hay una pregunta similar aquí ( Mac OS X Lion y sshpass) pero es específicamente acerca de un programa sshpass que no uso (aunque yo creo que la pregunta sería contestada por este así).

NOTA 2 - que no se puede crear el "cron" etiqueta b/c I carecen de suficiente rep. Si alguien con la suficiente succión podría hacerlo y etiqueta a esta pregunta, sería genial.

NOTA 3 - me doy cuenta de que la frase de paso menos de claves SSH iba a solucionar mi problema; sin embargo, prefiero no ir a esta ruta.

10voto

gecco Puntos 121

Para cualquier persona que termina en esta página, me di cuenta de que debo publicar la respuesta:

El uso de launchd en lugar de cron en efecto, solucionar el problema de la autorización. El usuario launchd puestos de trabajo (que se ejecutan sólo cuando se está conectado) utilizar correctamente la SSH agente de información que se desbloquea a través de su llavero de la parte de inicio de sesión (como parte del estándar de OS X de gestión de claves, ningún otro software necesario).

Para minimizar mis interacciones con launchd, he creado una única launchd trabajo que llama a un script de bash. De esta manera puedo simplemente editar el script sin tener que lidiar con launchd.

Aquí está el launchd archivo:

<?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>

He guardado el archivo ~/Library/LaunchAgents/com.mycron.hourly.plist, y luego se cargan con:

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

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

Si se sigue el mismo procedimiento, tendrá que cambiar el `ProgramArguments' string con la ruta correcta a su guión.

8voto

Añadiendo el siguiente código a su shell de bash script va a solucionar el problema:

declarar -x SSH_AUTH_SOCK=$( find /tmp/lanzamiento-*/Oyentes-usuario tu_usuario > - tipo s | head -1 )

Reemplazar "tu_usuario >" con su propio nombre de usuario.

Este código establece el valor correcto para SSH_AUTH_SOCK que informa "ssh" o "scp" acerca de cómo comunicarse con "ssh-agent" cuando la secuencia de comandos de shell que se inicia a partir de "cron".

1voto

Oskar Puntos 1242

Yo esperaría de seguridad mejorada de como sandbox y los cambios a mover las cosas para 64 bits está causando inesperado dolor.

No es una respuesta, de por sí, pero launchd está recibiendo todo el amor de apple en estos días.

No es la fijación de la cron problema, pero es más estable, así como más personas puedan ayudar con esto.

1voto

Boogy Puntos 376

Para cualquier persona encontrar esta ahora, tratando de hacer este trabajo en El Capitan, y aún reacios a su vez su línea de trabajo cron en un launchd script, Werner Antweiler la respuesta todavía funciona, pero el camino ha cambiado. El siguiente trabajó para mí:

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

NOTA: recuerde reemplazar tu_usuario > con su nombre de usuario!

No me deja enviar esto como un comentario sobre su respuesta ya que carecen de la reputación, pero yo no quería salir de ella sin actualizar esto, ya que definitivamente me ayudó a finalmente.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X