bash: l'utilizzo di scp nel processo cron ha esito negativo, ma viene eseguito correttamente quando eseguito dalla riga di comando


8

Sto cercando di usare scp in uno script bash eseguito da cron (lo sto eseguendo su Ubuntu 10.0.4 LTS).

Lo script funziona correttamente (ovvero trasferisce e copia file1 e file2 sul / dal server remoto, quando lo eseguo dalla riga di comando. Tuttavia, quando eseguo lo script come cron job, non riesce.

Ecco come appare la sceneggiatura:

#!/bin/bash

cd /home/oompah/scripts/tests/
scp -P 12345 file1 oompah@someserver.com:~/uploads

if scp -P 12345 oompah@someserver.com:/path/to/file2.dat local.dat >&/dev/null ; then 
    echo "INFO: transfer OK" ; 
else 
    echo "ERROR: transfer failed" ; 
fi

Il messaggio di errore che ricevo (reindirizzato a un file di registro) quando lo eseguo come processo cron è:

ERROR: transfer failed

Il messaggio di errore che ricevo nella mia casella di posta è:

Permission denied (publickey).
lost connection

Perché sta succedendo e come posso risolverlo ?.

[Modificare]

Ho modificato il primo comando scp con un comando -i (come suggerito da M Jenkins), ho anche aggiunto -v per i messaggi di debug. Ecco il registro completo dei messaggi di debug. Spero che possa far luce su ciò che sta succedendo:

Executing: program /usr/bin/ssh host 12.34.56.78, user oompah, command scp -v -t ~/uploads
OpenSSH_5.3p1 Debian-3ubuntu6, OpenSSL 0.9.8k 25 Mar 2009
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 12.34.56.78 [12.34.56.78] port 12345.
debug1: Connection established.
debug1: identity file /home/oompah/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3p1 Debian-3ubuntu3
debug1: match: OpenSSH_5.3p1 Debian-3ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu6
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host '[12.34.56.78]:12345' is known and matches the RSA host key.
debug1: Found key in /home/oompah/.ssh/known_hosts:3
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/oompah/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug1: No more authentication methods to try.
Permission denied (publickey).
lost connection
Permission denied (publickey).

3
Quale output ottieni se non reindirizzi stdout e stderr su / dev / null?
bmk

@bmk: senza il reindirizzamento stdout, ricevo i seguenti messaggi: Autorizzazione negata (chiave pubblica). connessione persa Autorizzazione negata (chiave pubblica).
oompahloompah,

Suggerimento: non scartare mai stderr in script come questo. È più utile che avere un singolo messaggio "ERRORE".
user1686

1
potrebbe essere che a.) usi un agente quando esegui il comando in modo interattivo, b.) lo esegui come un altro utente senza la propria coppia di chiavi (o cartella home) o c.) che le chiavi autorizzate sulla destinazione limita l'origine del connessione ...?
0xC0000022L

Risposte:


7

La mia ipotesi:

Hai una coppia di chiavi SSH protetta da password, che viene automaticamente caricata dal portachiavi GNOME quando effettui il login. Tuttavia, cronnon ha accesso al portachiavi e sshnon può nemmeno chiedere una password (a causa della mancanza di un tty).

Per citare il sshregistro che hai aggiunto:

debug1: offerta chiave pubblica : /home/oompah/.ssh/id_rsa
debug1: il server accetta la chiave: pkalg ssh-rsa blen 277
debug1: PEM_ read_PrivateKey fallito
debug1: leggi la chiave privata PEM eseguita: digita
debug1: read_passphrase: impossibile aprire / dev / tty : nessun dispositivo o indirizzo


@grawity: grazie per l'informazione. Come posso risolvere il problema però?
oompahloompah,

@oompah: rimuovi la password dalla tua coppia di chiavi. (Se vuoi, puoi crearne uno solo per uso automatico e darlo a scp -i.)
user1686

@grawity: grazie per il feedback. Non mi sento a mio agio nel rimuovere una password dal mio Keypair (non saprei come farlo in ogni caso). Fai riferimento alla creazione di una "seconda" - presumibilmente vuoi dire una seconda coppia di chiavi - ma questa senza password - quindi posso usarla per gli accessi automatici. A proposito, intendi PASSPHRASE quando dici la password?
Oompahloompah,

@oompah: se la tua macchina CentOS è fisicamente sicura, va bene. Il secondo suggerimento di coppia di chiavi sarà probabilmente utile solo se si dispone della coppia di chiavi primaria su molti sistemi. (OpenSSH lo chiama "passphrase", ma non molte persone usano in realtà un'intera frase per le loro chiavi.)
user1686

Alla fine ho capito che funzionava, dopo un sacco di problemi con il portachiavi, ecc. Alla fine, ho accettato il tuo suggerimento di creare una coppia di chiavi senza password per cron e passarla per scp nello script della shell. Non dovrebbe essere così difficile davvero ... SMH
oompahloompah

3

Sembra che scp non stia raccogliendo la tua coppia di chiavi pubblica / privata dalla tua directory ~ / .ssh.

Prova ad aggiungere

HOME=/home/oompah

nella parte superiore del file crontab (dovrebbe essere già impostato automaticamente comunque)

Potresti anche provare ad aggiungere

echo "DEBUG: My home dir is $HOME"

nel tuo script per assicurarti che ottenga il giusto valore.

Un'altra opzione è specificare il parametro -i per scp per forzare l'uso di una coppia di chiavi specifica:

scp -i /home/oompah/.ssh/id_rsa ...

per esempio.


Ho provato il tuo suggerimento (usando l'opzione -i). Si prega di vedere la mia domanda aggiornata
oompahloompah

3

Quale utente esegue cron? Sembra che l'utente non abbia accesso alla tua chiave pubblica.


0

Sebbene in questo caso non sia un problema, cron interpreta il segno di percentuale ( %) come carattere newline, quindi deve essere evaso ( \%) o finirai con mezzo comando chiedendoti perché cron semplicemente non fa nulla (anche se si lamenterà in syslog).

Ciò può causare problemi se lavori con /bin/datecrontab.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.