Non correspondance de version de protocole - votre shell est-il propre?

55

Lorsque vous suivez les instructions pour effectuer des sauvegardes rsync données ici: http://troy.jdmz.net/rsync/index.html

Je reçois le message d'erreur "Non concordance de version de protocole - votre shell est-il propre?"

J'ai lu quelque part que je devais couper les affichages d'invite (PS1 = "") et motd (.hushlogin) pour résoudre ce problème. C'est ce que j'ai fait, l'invite et la bannière de connexion (MOTD) n'apparaissent plus, mais l'erreur persiste quand je lance:

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

Le client ssh et le serveur sshd utilisent tous deux la version 2 du protocole.

Quel pourrait être le problème? Merci.

[EDIT] J'ai trouvé http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html qui indique qu'il est parfois nécessaire de "forcer v2 en utilisant le drapeau -2 pour ssh ou slogin

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

Il n’est pas clair que cela résout le problème car je pense que j’ai mis ce changement APRÈS que l’erreur ait changé, mais le fait est que l’erreur a évolué vers autre chose. Je mettrai à jour cela quand j'apprendrai Et je vais certainement essayer la suggestion d’exécuter ceci dans un shell emacs - merci.

rfreytag
la source
1
Vos scripts de connexion génèrent-ils quelque chose qui n'est pas immédiatement visible, par exemple une commande de changement de titre de fenêtre? Une façon de vérifier cela consiste à exécuter Emacs, à taper ESC x shellet à faire export TERM=xterm; ssh remotehost ls. Si des caractères de contrôle ou des sorties parasites apparaissent, c’est ce que vous devez rechercher.
Gilles, arrête de faire le mal.
1
J'avais le même problème. Dans mon cas, le serveur SSH a été configuré pour chrooter les utilisateurs et n'autoriser que l'accès SFTP. Il n'était donc pas possible d'exécuter la commande rsync à partir du shell distant. Si vous avez accès au serveur, recherchez l'option de configuration ForceCommand dans / etc / ssh / sshd_config. Si c'est réglé sur quelque chose, c'est le problème.
devius
Pour mémoire, je me suis retrouvé dans une situation où je venais d'abandonner avec une inadéquation de protocole. rsync --version de sortie identique sur les deux hôtes, ssh interactif et non interactif complètement silencieux, rien d'extraordinaire dans allowed_keys ... Cela ne fonctionne tout simplement pas. Je laisse ce commentaire à d’autres qui font du rabbibt holing. Faites-vous une faveur et essayez sans --rsync-path. Vous constaterez probablement que votre problème n'a rien à voir avec cet objectif.
Sheldonh
@sheldonh: le chemin sur la machine locale et la machine distante est-il différent dans votre cas? dans mon cas, ils sont les mêmes de toute façon et donner ou ne pas le donner ( --rsync-path) ne change rien pour moi.
0xC0000022L
1
@ 0xC0000022L Désolé, je ne me souviens plus.
Sheldonh

Réponses:

62

Un de vos scripts de connexion (.bashrc / .cshrc / etc.) Envoie probablement des données au terminal (alors que ce ne devrait pas être le cas). Cela provoque une erreur de ssh lorsqu’il se connecte et s’apprête à copier dès qu’il commence à recevoir des données supplémentaires inattendues. Supprimez la sortie générée dans les scripts de démarrage.

Vous pouvez vérifier si votre terminal est interactif et n’afficher que du texte en utilisant le code suivant dans un bashrc. Quelque chose d'équivalent existe aussi pour d'autres coquilles:

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

ou alternativement, comme ceci, puisque le paramètre spécial -contient ilorsque le shell est interactif:

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

Pour plus d'informations, voir: rsync via ssh de Linux à Windows sbs 2003 incompatibilité de protocole

Pour diagnostiquer cela, assurez-vous que ce qui suit est la sortie que vous obtenez lorsque vous vous connectez à l'hôte:

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

Si vous obtenez des nouvelles lignes ou d’autres données, vous savez que des sorties supplémentaires sont envoyées. Vous pouvez renommer votre .bashrc / .cshrc / .profile / etc. fichiers vers quelque chose d'autre afin qu'ils ne produisent pas de sortie supplémentaire. Bien sûr, il existe encore des fichiers système qui pourraient causer cela. Dans ce cas, vérifiez auprès de votre administrateur système que les fichiers système ne génèrent pas de données.

Andrew Case
la source
5
Un echodans le ~/.bashrc, Thx. Vous avez fait ma journée
user9869932
19

Il existe un moyen simple de tester si votre shell est propre, pour une connexion SSH: exécutez une commande à partir de la connexion SSH, plutôt que de démarrer un shell interactif. La falsecommande se terminera immédiatement sans produire de sortie, donc c'est un bon test:

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

Si cette ligne de commande produit une sortie, l’un de vos scripts de démarrage est à blâmer:

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$

Une autre chose à vérifier si vous obtenez cette erreur est de savoir si rsync est installé et localisable par 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$

Si rsync n'est pas dans le chemin, vous verrez quelque chose comme:

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

Vous pouvez résoudre ce problème en installant rsync ou, s'il est installé à un emplacement inhabituel, en transmettant l'emplacement à la ligne de commande rsync:

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

Cela est généralement causé par les informations de connexion de votre shell qui en sortent sur un shell non interactif. Vous pouvez tester si c'est le cas en faisant:

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

Si testfile n’est PAS 0 octets, le problème est que votre shell émet quelque chose. Vérifiez /etc/profile, .profile, .bashrc, .cshrc, etc. Dans ce cas, vous pouvez le changer pour vérifier si votre terminal est texte interactif et que la sortie en utilisant le code suivant dans un bashrc. Quelque chose d'équivalent existe aussi pour d'autres coquilles:

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

ou alternativement, comme ceci, puisque le paramètre spécial -contient ilorsque le shell est interactif:

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

Toutefois, si le fichier de test contient en fait 0 octets, votre shell se comporte correctement, mais il est possible que vous disposiez d’une version très ancienne de rsync. Vous pouvez indiquer à la fin du client (en supposant qu'il s'agisse de la plus récente) de ne pas publier de version aussi élevée que l'ancienne version du serveur rysnc ne la reconnaît pas. Vous pouvez le faire en utilisant l' --protocol=option. Dans mon cas, l'utilisation a --protocol=30fait l'affaire.

Si le problème persiste, essayez ssh dans la connexion de l'utilisateur avec lequel rsysnc est connecté et essayez rsync --versionde vérifier si le shell peut trouver rsync. Si quelque chose indique une commande introuvable, il est possible que rsync ne soit pas installé sur la machine à laquelle vous vous connectez ou qu'il ne soit pas dans le chemin. Rsync a des options pour spécifier le chemin de l'extrémité distante, lisez les pages de manuel.

Azendale
la source
+1 pour l'indice --protocolqui a résolu mon problème avec un serveur 2.5.6 (version 26 du protocole) et un client 3.1.0 (version 31 du protocole)
MattBianco le
4

C’est un cas spécial parmi les autres réponses, mais n’est pas très différent d’alors.

Pour exécuter un rsync via ssh, vous devez disposer d'un accès shell à ssh pour exécuter la commande rsync à distance. Si votre compte ssh n'autorise que scp / sftp, vous ne pourrez pas lancer la suppression de rsync et échouerez en donnant cette erreur.

Ceci peut être testé avec la même commande que ci-dessus

ssh remotehost false

Celui-ci devrait échouer et celui-ci devrait être un succès

sftp remotehost

Cela prouve que vous n’avez qu’un accès sftp.

Si vous le souhaitez et que vous disposez des autorisations nécessaires, vous pouvez désactiver l'accès sftp uniquement pour cet utilisateur en modifiant les options /etc/ssh/sshd_configet en vérifiant les entrées match et forcecommand.

Vous pouvez également consulter ce post

higuita
la source
4

J'ai eu protocol version mismatch -- is your shell clean?tout simplement parce que je n'avais pas encore installé rsync à l' autre bout. sudo yum install rsyncrésolu le problème.

Kjetil S.
la source
Ansible a passé 30 minutes à bricoler un conteneur et Ansible se demandait pourquoi rsync ne fonctionnait pas ... difficile à faire fonctionner quand il n'est pas installé! Merci;)
Ryan Fisher
2

L'invite n'apparaîtra pas du tout lors de l'exécution directe d'une commande, et de manière non interactive. Le premier résultat est un simple google: http://marc.info/?l=rsync&m=100263876212594&w=2 Et comme le shell peut potentiellement être appelé, il ne doit rien afficher en mode non interactif - comme lorsque vous tapez simplement " bash "dans une invite existante, seule la nouvelle invite doit apparaître.

dgq8
la source
Je n’ai peut-être pas été suffisamment clair, mais j’ai déjà fait cela "prompt (PS1 =" ") et motd (.hushlogin)". Le login ne montre en effet aucune invite. Malgré cela, l'erreur d'incompatibilité de protocole apparaît toujours. Merci bien - apprécions beaucoup la suggestion.
Rfreytag
En gros, vous en avez déjà parlé, mais j'ai eu des problèmes de ce type s'il y a quelque chose dans le .bashrc (ou un autre script de profil) qui répercute quoi que ce soit à l'écran. J'ai même eu ce genre de problème en exécutant certains programmes dans le shell qui changeait les choses d'une certaine manière (par exemple, je ne pouvais pas changer de shell avec chsh, j'avais donc .cshrc run bash pour changer mon shell, et ssh ne fonctionnerait plus).
LSD
Eh bien c'est certainement intéressant. Je me demande comment diagnostiquer cela, car l'exécution de la commande rsync de manière interactive ne montre rien en écho à l'écran et que la connexion est complètement silencieuse. Hmmm ... Je me demande s'il y a quelque chose qui cloche dans la coquille, comme vous le suggérez. Merci.
Rfreytag
1

Cela peut être dû à un message de connexion sur l'hôte distant tel que "Votre mot de passe va expirer dans 6 jours", ce que RSYNC n'attend pas.

Dief
la source