2009-11-04 19 views
6

Ho messo insieme questo script per aggiornare una cartella di repository Github biforcati su base giornaliera. Funziona bene se lo chiamo da un prompt, ma posso 'capire come farlo utilizzare il mio id_rsa in modo affidabile quando viene eseguito come un cron job. il eval 'ssh-agent' è un tentativo di fare proprio questo, ma non sembra avere alcun effetto positivo.Accesso alla chiave SSH dallo script di bash eseguito tramite un processo 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 

Questo è probabilmente un modo terribilmente inefficiente per andare sul processo in generale, ma funziona e non mi vedono mai. Se potessi farlo usare i miei crediti, sarei felice.

risposta

7

Credo che stiate usando il tipo sbagliato di preventivi. Plain-citando ssh-agent non fa nulla, è necessario incorporare i risultati dell'esecuzione esso utilizzando sostituzione di comando con:

eval `ssh-agent` 

o

eval $(ssh-agent) 

Questo fa sì che lo script per impostare le variabili d'ambiente necessarie. Tuttavia, ssh-agent non avrà ancora alcuna chiave a meno che tu non siate a ssh-add. Se le chiavi non hanno passphrase, è possibile eseguire semplicemente ssh-add dallo script.

Se la chiave privata ha una passphrase, è possibile eseguire questo script come daemon anziché come cron job. Questo ti permetterebbe di connetterti all'agente e aggiungere le tue chiavi private.

Il vero motivo per cui lo script funziona dalla riga di comando è che il proprio ambiente desktop è probabilmente in esecuzione ssh-agent e consente la propagazione delle variabili di ambiente necessarie a tutte le finestre del terminale. (O rendendoli bambini e ereditando le variabili o facendo in modo che la shell fornisca i comandi necessari.) Suppongo che tu stia utilizzando lo ssh-add ad un certo punto del tuo normale flusso di lavoro?

+0

Non ho mai eseguito ssh-add, ma sono su OS X, quindi la mia ipotesi è tutto ciò che sta accadendo per me. Creare una chiave senza passphrase e usare ssh-add sembra aver fatto il trucco. Ho anche fatto i bit dell'host in .ssh/config come suggeriva Greg. Ora funziona! Grazie –

2

Il processo ssh-agent fornisce solo una funzione da utilizzare con ssh-add per aggiungere la passphrase. Non rende automaticamente disponibile la chiave (la tua chiave privata non può essere decifrata senza la tua passphrase).

Per fare ciò, è necessario creare un passphraseless key e utilizzarlo dal processo cron. I normali avvisi di sicurezza si applicano quando si usano chiavi passphraseless.

+0

come dovrei indirizzare lo script a usare quella particolare chiave per connettersi a github? –

+2

Usa l'opzione -i per ssh, o configura un file '~/.ssh/config' che indica quale file chiave usare per gli host a cui ti stai connettendo. –

Problemi correlati