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.