Rsync sembra incompatibile con .bashrc (causa "la tua shell è pulita?")


16

Si scopre che rsync non può funzionare con un server remoto che ha un file .bashrc?

Al client locale ho ricevuto quando esegui rsync:

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(180) [sender=3.0.7]

Come suggerito qui, la rimozione di .bashrc sul server ha risolto il problema. Come risolverlo senza rimuovere il file .bashrc (temporaneamente)?


1
Controlla se ssh è abilitato per quell'account.
Lamy

Le risposte di seguito sono probabilmente errate. Di recente ho iniziato a ricevere questo errore dopo un aggiornamento di routine di Ubuntu, anche se non è cambiato nulla nei miei file .bashrc.
Cerin,

No: se la rimozione del file .bashrc lo risolve (come indicato in questa domanda), il problema viene generato dal file .bashrc. Un aggiornamento potrebbe certamente introdurre un'incompatibilità del protocollo reale, che è un problema completamente diverso.
Randall,

Risposte:


21

È possibile riscontrare problemi se .bashrcsul server remoto viene emesso qualcosa sul terminale. Rsync potrebbe non aspettarselo e potrebbe avere dei problemi di conseguenza.

È possibile risolvere questo problema rimuovendo tutti i comandi nel .bashrctesto di output o reindirizzando qualsiasi output a / dev / null.


3
Quindi, come indirizzare qualsiasi output a / dev / null se posso solo modificare i file sul client?
Computista,

1
Suppongo che tu possa come amministratore di sistema per assistenza. Potresti anche essere in grado di modificare i file sul server in un altro modo, come FTP o scp.
Greg Hewgill,

Sì, il mio file .bashrc conteneva un eco "*** Avvio di ROOT Shell ***" ed echo "(Usare sudo invece di una shell di root ogni volta che è possibile!)". La rimozione di questi echi ha risolto il problema.
Kentgrav,

1
Dalla pagina man rsync: "disadattamento della versione del protocollo - la tua shell è pulita?" Questo messaggio è in genere causato dagli script di avvio o dalla funzione di shell remota che produce immondizia indesiderata sul flusso utilizzato da rsync per il suo trasporto. Il modo per diagnosticare questo problema è eseguire la shell remota in questo modo: ssh remotehost / bin / true> out.dat quindi guardare il file out.dat. Se tutto funziona correttamente, out.dat dovrebbe essere un file di lunghezza zero.
Kentgrav,

8

Il .bashrc non è davvero il posto giusto per generare output, in quanto causa questo tipo di problema. Molte persone se ne vanno via, fino a quando non provano a eseguire rsync :-)

Qualsiasi output desiderato (e la logica e i comandi associati) dovrebbe essere spostato nel tuo .bash_profile (vedi, ad esempio, la domanda di errore del server ".profile vs. .bash_profile vs. .bashrc" per ulteriori discussioni sulle differenze tra i file).

In questo modo, non dovrai sacrificare l'ottenimento dell'output al momento del login, né occuparti di apportare modifiche temporanee al tuo .bashrc quando desideri utilizzare rsync.


6

Ho sempre avuto file .bashrc sui miei account utente e non ho mai avuto questo problema fino a quando non ho provato oggi a risincronizzare qualcosa sul mio server usando l'account root. Il tuo post mi ha aiutato a trovare la soluzione:

i miei file $ user / .bashrc iniziano sempre con la sezione seguente per evitare questo tipo di problema. L'ho replicato su .bashrc di root e rsync'ing ora funziona come un incantesimo!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

HTH, karsten


Questo di solito non funziona rsync, perché è per qualsiasi motivo classificato come "shell interattiva". Ma è comunque una buona linea da aggiungere, perché potrebbe rovinare shell non interattive altrimenti se ci fosse un output.
Michael Schubert,

Penso che questa sia la migliore soluzione alla domanda. La risposta di accettazione "rimozione di qualsiasi comando nel .bashrc che genera testo" non è pratica.
Qinsi,

4

Per ragioni complesse rsync / scp / sftp esegue .bashrc quando si connette a un altro host. Devi avere uno di questi comandi nella parte superiore del tuo .bashrc :

o

[[ $- != *i* ]] && return

o

[ -z "$PS1" ] && return

Uno dei comandi sopra consentirà solo l'esecuzione del resto dei comandi .bashrc per sessioni interattive . Per quanto ne so non ne hai bisogno per nessun altro tipo di sessione (e in effetti ho visto bashrc predefinito da Arch e Debian usare questa tecnica nella loro bashrc).

Se comunque vuoi essere paranoico in più nel lasciare che i tuoi comandi bashrc vengano eseguiti anche per sessioni non interattive, dovresti almeno avvolgere i comandi del tuo bashrc che producono output in questo modo ( riferimento ) in modo che vengano eseguiti solo in sessioni interattive:

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...code that produces output goes here...
fi

Nota che altri suggeriscono di spostare i comandi che generano testo sul tuo bash_profile ma ho i miei dubbi sul fatto che sia sempre buono (per i motivi spiegati qui )

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.