Tener un problema muy extraño. Creé un pequeño script bash que ejecuta un comando en un host remoto a través de ssh (usando la autenticación de clave pública).
Cuando ejecuto este script manualmente desde la línea de comando, funciona bien, pero cuando se coloca en /etc/cron.hourly falla con Permission denied, please try again.
error.
- Establezco explícitamente la clave en el script usando
ssh -i /root/.ssh/id_rsa user@remote "command"
; - el script se está ejecutando como root (agregué una
echo `id` > /tmp/whoami.log
para verificar dos veces ); y - la clave ssh no está protegida con contraseña ...
El sistema es el servidor Ubuntu 12.04, no tengo mucho acceso en el lado remoto para solucionar problemas, pero como dije, ejecutar ssh manualmente o el mismo script bash desde la línea de comandos funciona.
¿Alguna idea de por qué sucede esto o cómo solucionarlo?
actualizar
Resulta que estaba equivocado, y la clave ssh estaba protegida con contraseña (con el llavero cargando el agente ssh), de ahí por qué falló en un script pero no cuando se ejecutaba desde la sesión bash. Agregar . ~/.keychain/$HOSTNAME-sh
a mi script resolvió el problema (gracias a @grawity que me señaló en la dirección correcta y proporcionó una respuesta integral).
SSH_AUTH_SOCK
yKRB5CCNAME
variables de entorno.SSH_AUTH_SOCK
está relacionado (aunque estoy feliz de intentar algo). Estoy accediendo al archivo de claves directamente, y el archivo de claves no está protegido por contraseña. En cuanto aKRB5CCNAME
una búsqueda rápida mostrada, esto es algo que ver con Kerberos. Una vez más, no veo la conexión con este problema, pero tal vez me estoy perdiendo algo aquí ...-v
opción a esessh
comando ...ssh -i
comando en ambos casos ... Intentaré desarmar esas variables en el script y veré. Buena sugerencia para agregar-v
, yo también lo agregaré.Respuestas:
Los comandos interactivos y los trabajos cron se ejecutan en diferentes entornos, en particular, una sesión interactiva puede tener un agente SSH ejecutándose o un Kerberos TGT almacenado. Debido a la forma en que
ssh
ordena los métodos de autenticación, no puede estar seguro de que su clave se use solo porque agregó la-i
opción.Si se está ejecutando un agente SSH, el
ssh
cliente siempre prueba las claves del agente antes de usar cualquier clave especificada explícitamente.Si la red usa Kerberos y hay un TGT de Kerberos, OpenSSH lo usará antes de intentar la autenticación de clave pública.
No sé nada sobre su entorno, pero ambas posibilidades son fáciles de verificar:
Agregue
unset SSH_AUTH_SOCK
yunset KRB5CCNAME
antes delssh
comando, luego ejecute manualmente el script modificado.Esto evitará que el script vea al agente o los tickets de Kerberos, y solo usará la clave especificada explícitamente.
Agregue la
-v
opción assh
. Esto mostrará más detalles sobre cómo ocurre la autenticación.También puede agregar
-oIdentitiesOnly=yes
alssh
comando; esto lo obligará a usar la clave especificada .Esto generalmente no se recomienda, ya que el agente generalmente está estrechamente vinculado a su sesión de inicio de sesión interactiva. En particular, solo comienza cuando inicias sesión y desaparece cuando cierras sesión, y necesita tu contraseña para desbloquear las claves SSH (suponiendo que estén protegidas con contraseña).
Usted mencionó "Llavero". ¿Es este el programa OS X o el script Linux? (No sé mucho sobre la arquitectura de Mac OS X, pero AFAIK hace que sea mucho más difícil acceder al agente ssh del usuario desde un cronjob ...)
fuente
Otra solución a este problema es configurar cron en ssh en el cuadro local para ejecutar el comando ssh en lugar de ejecutar el archivo o comando por su ruta local absoluta. Esto almacena en caché el KRB5CCNAME y funciona donde / path / command no lo hace.
fuente
Puede usar ssh-cron para configurar conexiones SSH programadas para proteger servidores sin exponer sus claves SSH, pero usando el agente SSH.
fuente
puedes ejecutar tu script o comando en crontab como:
0 * * * * bash -c -l "/home/user/sshscript.sh"
o
0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"
fuente
cron
; así que esto realmente no parece proporcionar una respuesta.