Lors d’une synchronisation avec rsync over SSH, il peut arriver de tomber sur cette erreur :
TERM environment variable not set.
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2)Code language: JavaScript (javascript)
Le message est un peu cryptique, mais la cause est souvent simple : le shell distant affiche du texte au moment où rsync s’attend à parler uniquement avec le processus rsync distant.
Autrement dit, la connexion SSH fonctionne, mais quelque chose pollue le flux : un echo, un message de bienvenue, une commande interactive, un script dans .bashrc, un fortune, un neofetch, un tput, une bannière, ou un message lancé depuis /etc/ssh/sshrc.
Et rsync, lui, n’a aucun humour dans ce cas. Il lit du texte inattendu au lieu du protocole attendu, puis il répond : “is your shell clean?”. Traduction libre : “ton shell bavarde trop”.
Pourquoi rsync affiche “is your shell clean?”
Quand vous lancez une commande comme celle-ci :
rsync -avz ./site/ user@example.com:/var/www/site/Code language: JavaScript (javascript)
rsync ouvre une connexion distante, souvent via SSH, puis démarre un autre processus rsync sur le serveur distant. Les deux processus échangent ensuite des données selon le protocole rsync.
Si le shell distant imprime quelque chose avant le démarrage du rsync distant, le protocole est contaminé. Quelques caractères suffisent à casser l’échange.
La documentation rsync explique que l’erreur “protocol version mismatch — is your shell clean?” vient généralement de scripts de démarrage ou de la couche shell distante qui produisent une sortie parasite sur le flux utilisé par rsync. La méthode de diagnostic recommandée consiste à lancer une commande distante silencieuse et à vérifier qu’elle ne produit aucune sortie.