Perché ssh non riesce da crontab ma succedes quando eseguito da una riga di comando?

StackOverflow https://stackoverflow.com/questions/869589

  •  22-08-2019
  •  | 
  •  

Domanda

Ho uno script bash che fa ssh ad una macchina remota ed esegue un comando di là, come:

ssh -nxv user@remotehost echo "hello world"

Quando eseguire il comando da una riga di comando funziona bene, ma viene a mancare quando viene eseguito come parte di crontab (errorcode = 255 - non può stabilire una connessione SSH). Dettagli:

...
Waiting for server public key.
Received server public key and host key.
Host 'remotehost' is known and matches the XXX host key.
...
Remote: Your host key cannot be verified: unknown or invalid host key.
Server refused our host key.
Trying XXX authentication with key '...'
Server refused our key.
...

Quando si esegue localmente mi sto comportando come una radice, crontab funziona come root. L'esecuzione di 'id' dal crontab e la linea di comando dà esattamente lo stesso risultato:

$ id
> uid=0(root) gid=0(root) groups=0(root),...

Lo faccio ssh da una macchina locale al crond esecuzione macchina. Ho chiave SSH e le credenziali per SSH per crond della macchina e qualsiasi altra macchina che gli script si connette a.

PS. Si prega di non chiedere / protestare / commento che l'esecuzione di qualche cosa come root è male / male / etc -. Non è lo scopo di questa domanda

È stato utile?

Soluzione

Sono indovinando che normalmente quando si ssh dalla vostra macchina locale alla macchina che esegue crond, la chiave privata viene caricato in ssh-agent e inoltrato tramite la connessione. Così, quando si esegue il comando dalla riga di comando, che trova la propria chiave privata in ssh-agent e lo utilizza per collegarsi al computer remoto.

Quando crond esegue il comando, non ha accesso a ssh-agent, quindi non è possibile utilizzare la propria chiave privata.

Si dovrà creare una nuova chiave privata per l'utente root sulla crond macchina in movimento, e copiare la parte pubblica al file appropriato authorized_keys sulla macchina remota che si desidera crond per accedere a.

Altri suggerimenti

keychain

risolve questo in modo indolore. E 'nel pronti contro termine per Debian / Ubuntu:

sudo apt-get install keychain

e forse per molte altre distribuzioni (sembra che ha avuto origine da Gentoo).

Questo programma si avvierà un ssh-agent se nessuno è in esecuzione, e di fornire script di shell che possono essere source d e collegare la shell corrente a questo particolare bash.

Per id_rsa, con una chiave privata di nome .profile, aggiungere il seguente al vostro .bashrc:

keychain --nogui id_rsa

In questo modo avviare una cron e aggiungere la chiave crontab al primo login dopo il riavvio. Se la chiave è protetta da password, sarà anche chiedere la passphrase. Non c'è bisogno di utilizzare più chiavi non protetti! Per gli accessi successivi, riconoscerà l'agente e non chiedere una passphrase di nuovo.

Inoltre, aggiungere il seguente come ultima riga del tuo <=>:

. ~/.keychain/$HOSTNAME-sh

Questo farà si che il guscio di sapere dove per raggiungere l'agente SSH gestito da <=>. Assicurarsi che <=> proviene da <=>.

Tuttavia, sembra che <=> posti di lavoro ancora non si vede questo. Come rimedio, includere la riga sopra nella <=>, appena prima che il comando effettivo:

* * * * * . ~/.keychain/$HOSTNAME-sh; your-actual-command

Non esporre le tue chiavi SSH senza password. Utilizzare ssh-cron invece, che permette di pianificare le attività con agenti SSH.

Così ho avuto un problema simile. Sono venuto qui e ho visto diverse risposte, ma con un po 'di sperimentazione ecco come ho preso lavoro con sshkeys con passphrase, ssh-agent e cron.

Prima di tutto, la mia configurazione ssh utilizza il seguente script nel mio script bash init.

# JFD Added this for ssh
SSH_ENV=$HOME/.ssh/environment

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
        echo succeeded
        chmod 600 "${SSH_ENV}"
        . "${SSH_ENV}" > /dev/null
        /usr/bin/ssh-add
    }


    if [ -f "${SSH_ENV}" ]; then
         . "${SSH_ENV}" > /dev/null
         ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
            start_agent;
        }
   else
        start_agent;
   fi

Quando faccio il login, inserisco il mio password una volta sola e poi da lì in poi userà ssh-agent per autenticare me automaticamente.

I dettagli ssh-agent sono tenuti in .ssh / ambiente. Ecco cosa lo script sarà simile:

SSH_AUTH_SOCK=/tmp/ssh-v3Tbd2Hjw3n9/agent.2089; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2091; export SSH_AGENT_PID;
#echo Agent pid 2091;

Per quanto riguarda cron, è possibile impostare un lavoro come un normale utente in vari modi. Se si esegue crontab -e come utente root lo farà impostare un cron utente root. Se si esegue come crontab -u Davis -e si aggiunge un job cron come userid Davis. Allo stesso modo, se si esegue come utente Davis e non crontab -e si creerà un job cron che viene eseguito come userid Davis. Questo può essere verificato con la seguente voce:

30 *  *   *   *     /usr/bin/whoami

Questa sarà posta il risultato di whoami ogni 30 minuti per utente Davis. (Ho fatto un -e crontabe come utente Davis.)

Se si tenta di vedere ciò che i tasti sono utilizzati come utente Davis, fare questo:

36 *  *   *   *     /usr/bin/ssh-add -l

E 'fallirà, il registro inviata per posta dirà

To: davis@xxxx.net
Subject: Cron <davis@hostyyy> /usr/bin/ssh-add -l

Could not open a connection to your authentication agent.

La soluzione è quella di risalire allo script di ENV per ssh-agent sopra. Ecco la voce di cron risultante:

55 10  *   *   *     . /home/davis/.ssh/environment; /home/davis/bin/domythingwhichusesgit.sh

Questo verrà eseguito lo script alle 10:55. Si noti la leader. nello script. Si dice per eseguire questo script nel mio ambiente simile a quello che è nello script di init .bash.

Ieri ho avuto problema simile ...

Non ho lavoro cron su un server, che inizia qualche azione su un altro server, utilizzando ssh ... Il problema era i permessi degli utenti, e le chiavi ...

in crontab ho avuto

* * * * * php /path/to/script/doSomeJob.php

E semplicemente non ha funzionato (non ha ancora dispone delle autorizzazioni). Ho provato a correre cron come utente specifico, che è collegato a un altro server

* * * * * user php /path/to/script/doSomeJob.php

Ma senza alcun effetto.

Infine, i navicate di script e quindi eseguire il file php, e ha funzionato ..

* * * * * cd /path/to/script/; php doSomeJob.php
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top