incompatibilidade de versão do protocolo - seu shell está limpo?

55

Ao seguir as instruções para fazer backups rsync fornecidos aqui: http://troy.jdmz.net/rsync/index.html

Recebo o erro "incompatibilidade de versão do protocolo - seu shell está limpo?"

Li em algum lugar que precisava silenciar o prompt (PS1 = "") e o motd (.hushlogin) é exibido para lidar com isso. Eu fiz isso, o prompt e o banner de login (MOTD) não aparecem mais, mas o erro ainda aparece quando executo:

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

O cliente ssh e o servidor sshd estão usando a versão 2 do protocolo.

Qual poderia ser o problema? Obrigado.

[EDIT] Encontrei http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html que indica que às vezes é necessário "Forçar v2 usando o sinalizador -2 para ssh ou slogin

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

Não está claro que isso resolveu o problema, pois acho que coloquei essa alteração APÓS o erro ser alterado, mas o fato é que o erro evoluiu para outra coisa. Vou atualizar isso quando souber mais. E certamente tentarei a sugestão de executar isso em um shell do emacs - obrigado.

rfreytag
fonte
11
Seus scripts de login produzem algo que não é visível imediatamente, por exemplo, um comando de alteração de título da janela? Uma maneira de verificar isso é executar o Emacs, digite ESC x shelle faça export TERM=xterm; ssh remotehost ls. Se algum caractere de controle ou outra saída falsa aparecer, é isso que você precisa caçar.
Gilles 'SO- stop be evil'
11
Eu estava tendo o mesmo problema. No meu caso, o servidor SSH foi configurado para chroot os usuários e permitir apenas o acesso ao SFTP, portanto não foi possível executar o comando rsync a partir do shell remoto. Se você tiver acesso ao servidor, verifique a opção de configuração ForceCommand em / etc / ssh / sshd_config. Se estiver definido como algo, esse é o problema.
Devius
Para constar, eu me deparei com uma situação em que simplesmente desisti de uma incompatibilidade de protocolo. rsync - saída de versão idêntica nos dois hosts, ssh interativo e não interativo completamente silencioso, nada extravagante nas chaves_autorizadas ... Simplesmente não funciona. Deixo este comentário para outras pessoas que estão rabinando. Faça um favor a si mesmo e tente sem --rsync-path. Você provavelmente descobrirá que seu problema não tem nada a ver com esse SO.
sheldonh
@sheldonh: o caminho na máquina local e remota diferiu no seu caso? no meu caso, são iguais e dar ou não ( --rsync-path) não muda nada para mim.
0xC0000022L
11
@ 0xC0000022L Desculpe, não me lembro.
sheldonh

Respostas:

62

Um dos seus scripts de login (.bashrc / .cshrc / etc.) Provavelmente está enviando dados para o terminal (quando não deveria ser). Isso está causando o erro do ssh quando ele está se conectando e se preparando para copiar, pois começa a receber dados extras que não esperava. Remova a saída gerada nos scripts de inicialização.

Você pode verificar se o seu terminal é interativo e apenas produz texto usando o seguinte código em um bashrc. Também existe algo equivalente para outras conchas:

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

ou, alternativamente, assim, já que o parâmetro especial -contém iquando o shell é interativo:

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

Para obter mais informações, consulte: rsync via ssh do linux para incompatibilidade de protocolo do windows sbs 2003

Para diagnosticar isso, verifique se o seguinte é o resultado que você obtém quando faz o ssh no host:

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

Se você receber novas linhas ou outros dados, saberá que está sendo enviada uma saída extra. Você pode renomear seu arquivo .bashrc / .cshrc / .profile / etc. arquivos para outra coisa, para que eles não produzam saída extra. Claro que ainda existem arquivos do sistema que podem causar isso. Nesse caso, verifique com o administrador do sistema se os arquivos do sistema não produzem dados.

Andrew Case
fonte
5
Um echono ~/.bashrc, Thx. Você fez o meu dia
user9869932
19

Existe uma maneira simples de testar se o seu shell está limpo, para uma conexão ssh: execute um comando a partir da conexão ssh, em vez de iniciar um shell interativo. O falsecomando será encerrado imediatamente sem produzir nenhuma saída, portanto é um bom teste:

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

Se essa linha de comando produzir alguma saída, um dos seus scripts de inicialização é o responsável:

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$

Outra coisa para verificar se você está recebendo esse erro é se o rsync está instalado e localizável pelo 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 o rsync não estiver no caminho, você verá algo como:

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

Você pode corrigir isso instalando o rsync ou, se estiver instalado, mas em um local incomum, passando o local para a linha de comando do 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
fonte
7

Isso geralmente é causado pelas coisas de logon do seu shell que produzem coisas em um shell não interativo. Você pode testar se este é o caso, fazendo:

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

Se testfile NÃO for 0 bytes, o problema é que seu shell está produzindo algo. Verificação /etc/profile, .profile, .bashrc, .cshrc, etc. Se for, você pode alterá-lo para verificar se o seu terminal é um texto interativo e apenas a saída usando o seguinte código em um bashrc. Também existe algo equivalente para outras conchas:

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

ou, alternativamente, assim, já que o parâmetro especial -contém iquando o shell é interativo:

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

No entanto, se o arquivo de teste é de fato 0 bytes, seu shell está se comportando, mas é possível que você tenha apenas uma versão muito antiga do rsync. Você pode dizer ao cliente final (supondo que seja o final mais recente) que não anuncie uma versão tão alta que a versão antiga do servidor rysnc não a reconheça. Você pode fazer isso usando a --protocol=opção No meu caso, usando --protocol=30fez o truque.

Se você ainda estiver tendo problemas, tente ssh enquanto o usuário rsysnc está se conectando e tente executar rsync --versionpara verificar se o shell pode encontrar o rsync. Se você receber algo que diz que o comando não foi encontrado, o rsync pode não estar instalado na máquina à qual você está se conectando ou pode não estar no caminho. O Rsync tem opções para especificar o caminho da extremidade remota, leia as páginas de manual.

Azendale
fonte
+1 para o dica sobre --protocolo que resolveu o meu problema com um servidor 2.5.6 (protocolo versão 26) e uma 3.1.0 cliente (versão do protocolo 31)
Matt Bianco
4

Este é um caso especial das outras respostas, mas não é muito diferente a partir de então.

Para executar um rsync via ssh, você precisa de acesso ao shell no ssh para executar o comando rsync remoto. Se sua conta ssh permitir apenas scp / sftp, você não poderá iniciar a remoção do rsync e falhará ao fornecer esse erro.

Isso pode ser testado com o mesmo comando acima

ssh remotehost false

Este deve falhar e este deve ser sucesso

sftp remotehost

Isso prova que você tem um acesso apenas por sftp.

Se você quiser e tiver permissões para fazê-lo, poderá desativar o acesso apenas por sftp para esse usuário, editando as entradas /etc/ssh/sshd_confige verifique match e forcecommand.

Você também pode verificar esta postagem

higuita
fonte
4

Fiquei protocol version mismatch -- is your shell clean?simplesmente porque ainda não tinha instalado o rsync na outra extremidade. sudo yum install rsyncresolveu o problema.

Kjetil S.
fonte
Passei 30 minutos mexendo com um contêiner e Ansible se perguntando por que o rsync não estava funcionando ... difícil para ele funcionar quando não está instalado! Obrigado;)
Ryan Fisher
2

O prompt não será exibido ao executar um comando diretamente, e de maneira não interativa. Um simples google exibe o primeiro resultado: http://marc.info/?l=rsync&m=100263876212594&w=2 E como o shell pode ser invocado, ele não deve exibir nada no modo não interativo, como digitar apenas " bash "em um prompt existente, nada além do novo prompt deve aparecer.

dgq8
fonte
Talvez eu não tenha deixado claro o suficiente, mas já fiz esse "prompt (PS1 =" ") e motd (.hushlogin)". O login, na verdade, não mostra nenhum prompt. Apesar disso, o erro de incompatibilidade de protocolo ainda aparece. Obrigado embora - muito aprecio a sugestão.
Rfreytag 6/05
Você já mencionou isso basicamente, mas já tive problemas como esse se houver algo no .bashrc (ou outro script de perfil) que faça eco à tela. Eu até tive esse tipo de problema ao executar certos programas no shell que alteram as coisas de uma certa maneira (por exemplo, não consegui alterar meu shell com chsh, então fiz com que meu .cshrc execute o bash para alterar meu shell e ssh não funcionariam mais).
Lsd
Bem, isso é certamente interessante. Gostaria de saber como posso diagnosticar isso, uma vez que a execução interativa do comando rsync não mostra nada ecoado na tela e o login é completamente silencioso? Hmmm ... Gostaria de saber se há algo errado com a concha, como você sugere. Obrigado.
Rfreytag 7/05
1

Isso pode ser causado por uma mensagem de logon no host remoto, como "Sua senha expirará em 6 dias", que o RSYNC não espera

Dief
fonte