2009-11-04 15 views
6

He puesto esta secuencia de comandos unida para actualizar diariamente una carpeta de repositorios Github bifurcados. Funciona bien si lo llamo desde un aviso, pero no puedo 'averiguar cómo hacer que utilice mi id_rsa de manera confiable cuando se ejecuta como un trabajo cron. el eval 'ssh-agent' es un intento de hacer justamente eso, pero no parece tener ningún efecto positivo.Accediendo a la clave SSH desde el script bash ejecutándose a través de un trabajo cron

#!/bin/sh 
LOGPATH=log.txt 
eval 'ssh-agent' 
cd /path/to/update/folder 
echo "-------START UPDATE-------">$LOGPATH 
echo "Updating repos:">>$LOGPATH 
date "+%F %T">>$LOGPATH 
COUNT=1 
find . -maxdepth 1 -type d | while read dir; do 
cd "$dir" 
LEN=$"${#dir}" 
if [ $LEN != "1" ] 
    then 
    echo "*********">>$LOGPATH 
    echo "$COUNT. " ${dir:2}>>$LOGPATH 
    /usr/local/bin/git pull upstream master>>$LOGPATH 2>> $LOGPATH 
    /usr/local/bin/git push origin master>>$LOGPATH 2>> $LOGPATH 
    let COUNT=COUNT+1 
fi 
cd "$OLDPWD" 
done 
echo "-------END UPDATE-------">>$LOGPATH 
exit 0 

Esta es probablemente una manera terriblemente ineficiente para ir sobre el proceso en general, pero funciona y no se te ocurra lo ven. Si pudiera hacer que usara mi creds, estaría eufórico.

Respuesta

7

Creo que está utilizando un tipo incorrecto de citas. Plain-citando a ssh-agent no hace nada, es necesario incorporar los resultados de la ejecución mediante el uso de comando de sustitución con:

eval `ssh-agent` 

o

eval $(ssh-agent) 

Esto hace que la secuencia de comandos para configurar las variables de entorno necesarias. Sin embargo, ssh-agent aún no tendrá ninguna clave a menos que ssh-add. Si sus claves no tienen frase de contraseña, entonces ssh-add simplemente se puede ejecutar desde la secuencia de comandos.

Si su clave privada tiene una frase de contraseña, es posible que desee ejecutar esta secuencia de comandos como un daemon en lugar de un trabajo de cron. Esto le permitiría conectarse con el agente y agregar sus claves privadas.

La verdadera razón por la cual la secuencia de comandos funciona desde la línea de comandos es que su entorno de escritorio probablemente se está ejecutando ssh-agent y arregla para que las variables de entorno necesarias se propaguen a todas sus ventanas de terminal. (Ya sea haciéndolos ser hijos y heredando las variables o haciendo que su shell ordene los comandos necesarios.) ¿Supongo que está ejecutando ssh-add en algún punto de su flujo de trabajo normal?

+0

Nunca he ejecutado ssh-add, pero estoy en OS X, así que supongo que es todo lo que está sucediendo para mí. Crear una clave sin contraseña y usar ssh-add parece haber hecho el truco. También hice los bits de host en .ssh/config como sugirió Greg. ¡Ahora funciona! Gracias –

2

El proceso ssh-agent solo proporciona una función para usar con ssh-add para agregar su frase de contraseña. No hace que su clave esté disponible automáticamente (su clave privada no se puede descifrar sin su frase de contraseña).

Para hacer esto, deberá crear un passphraseless key y usarlo desde el trabajo cron. Las advertencias de seguridad habituales se aplican cuando se utilizan claves sin contraseña.

+0

¿cómo podría dirigir el script para usar esa clave en particular para conectar con github? –

+2

Utilice la opción -i para ssh, o configure un archivo '~/.ssh/config' que indique qué archivo de clave usar para el host (s) al que se está conectando. –

Cuestiones relacionadas