mancata corrispondenza della versione del protocollo: la shell è pulita?


55

Quando si seguono le istruzioni per eseguire i backup rsync fornite qui: http://troy.jdmz.net/rsync/index.html

Viene visualizzato l'errore "Mancata corrispondenza della versione del protocollo: la shell è pulita?"

Ho letto da qualche parte che avevo bisogno di mettere a tacere i prompt (PS1 = "") e motd (.hushlogin) per far fronte a questo. Ho fatto questo, il prompt e il banner di login (MOTD) non appaiono più, ma l'errore appare ancora quando eseguo:

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" remoteuser@remotehost:/remote/dir /this/dir/

Sia il client ssh che il server sshd utilizzano la versione 2 del protocollo.

Quale potrebbe essere il problema? Grazie.

[EDIT] Ho trovato http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html che indica che a volte è necessario "Force v2 utilizzando il flag -2 per ssh o slogin

 ssh -2 -i ~/.ssh/my_private_key remotemachine"

Non è chiaro che ciò abbia risolto il problema poiché penso di aver inserito questa modifica in DOPO che l'errore è cambiato, ma il fatto è che l'errore si è evoluto in qualcos'altro. Lo aggiornerò quando imparerò di più. E certamente proverò il suggerimento di eseguirlo in una shell emacs - grazie.


1
Gli script di accesso generano qualcosa che non è immediatamente visibile, ad esempio un comando di modifica del titolo della finestra? Un modo per verificarlo è eseguire Emacs, digitare ESC x shelle fare export TERM=xterm; ssh remotehost ls. Se vengono visualizzati caratteri di controllo o altri output spuri, questo è ciò che devi dare la caccia.
Gilles 'SO- smetti di essere malvagio'

1
Avevo lo stesso problema. Nel mio caso il server SSH è stato configurato per chroot gli utenti e per consentire solo l'accesso SFTP, quindi non è stato possibile eseguire il comando rsync dalla shell remota. Se hai accesso al server, controlla l'opzione di configurazione ForceCommand in / etc / ssh / sshd_config. Se è impostato su qualcosa, questo è il problema.
devius,

Per la cronaca, mi sono imbattuto in una situazione in cui ho appena rinunciato a una mancata corrispondenza del protocollo. rsync - l'output della versione è identico su entrambi gli host, ssh interattivo e non interattivo completamente silenzioso, niente di speciale nei quadri autorizzati ... Semplicemente non funziona. Lascio questo commento per gli altri che sono forati conigli. Fatevi un favore e provate senza --rsync-path. Probabilmente scoprirai che il tuo problema non ha nulla a che fare con questo SO.
sheldonh,

@sheldonh: il percorso sulla macchina locale e remota differiva nel tuo caso? nel mio caso sono uguali e dare o non dare ( --rsync-path) non cambia nulla per me.
0xC0000022L

1
@ 0xC0000022L Siamo spiacenti, non ricordo.
sheldonh,

Risposte:


62

Uno dei tuoi script di login (.bashrc / .cshrc / etc.) Probabilmente sta inviando i dati al terminale (quando non dovrebbe essere). Questo sta causando l'errore di ssh quando si connette e si prepara a copiare mentre inizia a ricevere dati extra che non si aspetta. Rimuovere l'output generato negli script di avvio.

Puoi verificare se il tuo terminale è interattivo e emette solo testo usando il seguente codice in una bashrc. Qualcosa di equivalente esiste anche per altre shell:

if shopt -q login_shell; then
    [any code that outputs text here]
fi

o in alternativa, in questo modo, poiché il parametro speciale -contiene iquando la shell è interattiva:

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

Per ulteriori informazioni, consultare: rsync tramite ssh da Linux a Windows sbs 2003 disadattamento del protocollo

Per diagnosticare questo, assicurarsi che quanto segue sia l'output che si ottiene quando si accede all'host:

USER@HOSTNAME's password: 
Last login: Mon Nov  7 22:54:30 2011 from YOURIP
[USER@HOSTNAME ~]$ 

Se ricevi nuove righe o altri dati, sai che viene inviato un output aggiuntivo. Potresti rinominare il tuo .bashrc / .cshrc / .profile / etc. file a qualcos'altro in modo che non generino output extra. Naturalmente ci sono ancora file di sistema che potrebbero causare questo. In tal caso, verificare con l'amministratore di sistema che i file di sistema non generino dati.


5
An echoin the ~/.bashrc, Thx. Hai reso la mia giornata
user9869932

19

Esiste un modo semplice per verificare se la shell è pulita, per una connessione ssh: eseguire un comando dalla connessione ssh, anziché avviare una shell interattiva. Il falsecomando terminerà immediatamente senza produrre alcun output, quindi è un buon test:

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash$

Se quella riga di comando produce un output, uno dei tuoi script di avvio è la colpa:

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
Welcome to RemoteHost!

This system is company property and is provided for authorized use only, 
as set forth in applicable written policies. Unauthorized use is prohibited 
and may be subject to discipline, civil suit and criminal prosecution.

Welcome back - You last logged in 16 days ago...
bash$

Un'altra cosa da verificare se si verifica questo errore è se rsync è installato e localizzabile da ssh:

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
bash$

Se rsync non è nel percorso, vedrai invece qualcosa del tipo:

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash: rsync: command not found
bash$

È possibile risolvere questo problema installando rsync o se è installato ma in una posizione insolita, passando la posizione alla riga di comando rsync:

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" \
    --rsync-path="/usr/local/bin/rsync" \
    remoteuser@remotehost:/remote/dir /this/dir/

7

Questo è comunemente causato dalle cose di login della shell che producono oggetti su una shell non interattiva. Puoi verificare se questo è il caso facendo:

ssh username@host "/bin/true" > testfile
ls -l testfile

Se testfile NON è 0 byte, il problema è che la shell sta emettendo qualcosa. Controllare /etc/profile, .profile, .bashrc, .cshrc, ecc Se lo è, si può cambiare per verificare se il terminale è un testo interattivo e solo l'uscita utilizzando il seguente codice in un bashrc. Qualcosa di equivalente esiste anche per altre shell:

if shopt -q login_shell; then
    [any code that outputs text here]
fi

o in alternativa, in questo modo, poiché il parametro speciale -contiene iquando la shell è interattiva:

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

Tuttavia, se il file di test è in realtà 0 byte, allora la shell si sta comportando, ma è possibile che tu abbia solo una versione molto vecchia di rsync. Puoi dire al client (supponendo che sia il più recente) di non pubblicizzare una versione così alta che la vecchia versione del server rysnc non la riconosce. Puoi farlo usando l' --protocol=opzione. Nel mio caso, usare ha --protocol=30fatto il trucco.

Se i problemi persistono, provare ssh mentre l'utente rsysnc si sta connettendo e provare a correre rsync --versionper vedere se la shell riesce a trovare rsync. Se ricevi qualcosa che dice che il comando non è stato trovato, allora rsync potrebbe non essere installato sul computer a cui ti stai connettendo o potrebbe non essere nel percorso. Rsync ha opzioni per specificare il percorso dell'estremità remota, leggi le pagine man.


+1 per il suggerimento su --protocolcui ho risolto il mio problema con un server 2.5.6 (protocollo versione 26) e un client 3.1.0 (protocollo versione 31)
MattBianco

4

Questo è un caso speciale rispetto alle altre risposte, ma non è molto diverso da allora.

Per eseguire un rsync tramite ssh, è necessario l'accesso alla shell in ssh per eseguire il comando rsync remoto. Se il tuo account ssh consente solo scp / sftp, non sarai in grado di avviare la rimozione di rsync e non riuscirà a dare questo errore.

Questo può essere testato con lo stesso comando di cui sopra

ssh remotehost false

Questo dovrebbe fallire e questo dovrebbe avere successo

sftp remotehost

Ciò dimostra che hai un accesso solo sftp.

Se si desidera e si dispone delle autorizzazioni per farlo, è possibile disabilitare l'accesso sftp solo per quell'utente, modificando /etc/ssh/sshd_confige controllare match e le forcecommandvoci.

Puoi anche controllare questo post


4

Ho ottenuto protocol version mismatch -- is your shell clean?semplicemente perché non avevo ancora installato rsync dall'altra parte . sudo yum install rsyncproblema risolto.


Ho passato 30 minuti a scherzare con un contenitore e Ansible si chiedeva perché rsync non funzionasse ... faticosamente che funzionasse quando non è installato! Grazie;)
Ryan Fisher

2

Il prompt non verrà mostrato affatto quando si esegue direttamente un comando e in modo non interattivo. Un semplice google mostra il primo risultato: http://marc.info/?l=rsync&m=100263876212594&w=2 E poiché la shell può essere potenzialmente invocata, non deve visualizzare nulla in modalità non interattiva, come quando si digita semplicemente " bash "in un prompt esistente, non dovrebbe apparire altro che il nuovo prompt.


Forse non l'ho chiarito sufficientemente, ma ho già fatto questo "prompt (PS1 =" ") e motd (.hushlogin)". L'accesso infatti non mostra alcun prompt. Nonostante ciò, appare ancora l'errore di mancata corrispondenza del protocollo. Grazie comunque - apprezzo molto il suggerimento.
rfreytag,

Fondamentalmente hai già detto questo, ma ho avuto problemi come questo se c'è qualcosa nel .bashrc (o altro script del profilo) che echi qualcosa sullo schermo. Ho anche avuto questo tipo di problema durante l'esecuzione di determinati programmi nella shell che cambia le cose in un certo modo (ad esempio, non sono stato in grado di cambiare la mia shell con chsh, quindi ho avuto il mio .cshrc eseguito bash per cambiare il mio shell e ssh non funzionerebbero più).
lsd

Bene, questo è sicuramente interessante. Mi chiedo come potrei diagnosticare questo dato che l'esecuzione del comando rsync in modo interattivo non mostra nulla di echo sullo schermo e il login è completamente silenzioso? Hmmm ... Mi chiedo se ci sia qualcosa che non va con la conchiglia come suggerisci. Grazie.
rfreytag,

1

Ciò può essere causato da un messaggio di accesso sull'host remoto come "La tua password scadrà tra 6 giorni" che RSYNC non si aspetta

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.