2009-04-08 5 views
9

Sto cercando di rsync file tra due server confile rsync'ing tra due server remoti, vengono errori che dichiarano rsync comando non trovato sul server remoto

rsync -avlzp /source [email protected]:/destination 

ma invece vengo errori affermando

bash: rsync: command not found 
rsync: connection unexpectedly closed (0 bytes received so far) [sender] 
rsync error: error in rsync protocol data stream (code 12) at io.c(635) [sender=3.0.2] 

ma rsync è installato su entrambi i server. Che cosa sto facendo di sbagliato? Ho anche provato

rsync -av -e "ssh -l ssh-user" /source server:/destination 

con lo stesso risultato.

sto principalmente cercando di utilizzare rsync modo che solo se esiste copie oltre differenze ...

Grazie

risposta

15

rsync può essere nel percorso sul computer remoto quando si esegue una shell interattiva, ma non quando si esegue rsync con ssh (con una shell non interattiva). .bashrc viene normalmente eseguito solo per shell interattive, ad esempio, quindi se il percorso è definito lì, non verrà analizzato quando si esegue rsync --server sul terminale remoto. Prova/etc/profile. Vedi bash(1) per maggiori dettagli.

È possibile utilizzare --rsync-path per specificare il percorso del binario rsync sulla macchina remota.

+0

Grazie per questo. Usare '--rsync-path' ha funzionato per me. – Lightbulb1

7

Ci sono molte buone informazioni su questo problema, inclusa la risposta sopra. Ma nel mio caso, sono un amministratore sia delle macchine di origine che di destinazione e volevo capire cosa stava succedendo e quali "giuste" opzioni di configurazione avrebbero risolto il problema. Non ho avuto pieno successo ma sembra probabile che altri possano trovare utili queste informazioni.

Come la risposta precedente afferma, rsync potrebbe trovarsi nel percorso sulla macchina remota quando si esegue una shell interattiva, ma non quando si esegue rsync tramite ssh. Come Siddesh nota a http://siddesh-bg.blogspot.com/2009/02/rsync-command-not-found-error-even.html questo può essere risolto specificando esplicitamente il percorso del rsync distanza dalla shell locale:

rsync -av --rsync-path=/usr/local/bin/rsync -e "ssh -l ssh-user" /source server:/destination 

Ma come amministratore ho voluto risolvere il problema, non solo lavorare intorno ad esso. OldSchool inviato un approccio di risoluzione dei problemi utile a https://groups.google.com/group/comp.unix.solaris/browse_thread/thread/0a06a4d382d752d8?pli=1

egli suggeriamo di scoprire che cosa shell è in esecuzione per voi sulla macchina remota, allora quale strada è stata stabilita lì:

ssh [email protected] 'echo $SHELL' 
ssh [email protected] 'echo $PATH' 

Tom Feiner ha un bel post a Why does an SSH remote command get fewer environment variables then when run manually? che discute la definizione dell'ambiente della shell di esecuzione del comando SSH.

OldSchool ha anche osservato che "man sshd_config" fornisce alcune informazioni su come una sessione ssh ottiene un ambiente. L'impostazione sshd_config "PermitUserEnvironment" può essere impostata in modo che l'utente ~/.ssh/environment sul lato server e le opzioni di ambiente nel file AuthorizedKeysFile vengano elaborate da sshd. L'impostazione predefinita è no.

Quindi con le impostazioni sshd_config predefinite il percorso verrà creato dalla shell predefinita. Se il comando ssh richiede una sessione interattiva (ssh user @ host), sul server remoto la shell predefinita eseguirà un accesso interattivo, che probabilmente determinerà il PERCORSO che ci si aspetta.Ma se stai iniziando una sessione ssh per rsync (rsync -av --rsync-path =/usr/local/bin/rsync -e "ssh -l ssh-user"/source server:/destination) allora il server remoto una shell di esecuzione del comando SSH che è una shell non interattiva. Nel mio caso, la shell remota non interattiva (bash) non sta eseguendo/etc/profile, perché lo fa solo per shell interattive o shell non interattive con l'opzione --login. Potrei forzare in questo modo:

ssh [email protected] 'echo $PATH;source /etc/profile;echo $PATH' 

ho anche studiato "SSH Secure Shell" di Daniel Barrett & Richard Silverman (O'Reilly 2001) e impostare un percorso in/etc/ssh/SSHRC che speravo avrebbe fatto rsync è disponibile per le shell di esecuzione dei comandi SSH, ma,/etc/ssh/sshrc viene eseguito prima che venga invocata la shell o il comando degli utenti, e apparentemente l'ambiente non viene passato a quella shell o comando.

A questo punto ho intenzione di essere soddisfatti con l'opzione della riga di comando rsync, vale a dire:

rsync -av --rsync-path=/usr/local/bin/rsync -e "ssh -l ssh-user" /source server:/destination 

perché io sono preoccupato del fatto che se cambio l'impostazione sshd_config "PermitUserEnvironment" allora io probabilmente non riuscire un titolo verifica sui miei server. Potrei riesaminarlo dopo aver acquisito maggiore esperienza con gli audit di sicurezza della nostra organizzazione.

Problemi correlati