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

49

Ao seguir as instruções para fazer backups de rsync aqui: link

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

Eu li em algum lugar que eu precisava silenciar as exibições prompt (PS1="") e motd (.hushlogin) para lidar com isso. Eu fiz isso, o prompt e login banner (MOTD) não aparecem mais, mas o erro ainda aparece quando eu corro:

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.

[EDITAR] Eu encontrei o link que direciona 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 se isso resolveu o problema, pois acho que coloquei essa alteração em DEPOIS de o erro ser alterado, mas o fato é que o erro evoluiu para outra coisa. Vou atualizar isso quando souber mais. E certamente irei tentar a sugestão para executar isso em um shell do emacs - obrigado.

    
por rfreytag 06.05.2011 / 23:15

7 respostas

54

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

Você pode verificar se o seu terminal é interativo e só envia texto usando o seguinte código em um bashrc. Algo equivalente existe para outras shells também:

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

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

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

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

Para diagnosticar isso, certifique-se de que o seguinte é a saída que você obtém quando envia ssh para o 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, você sabe que uma saída extra está sendo enviada. Você pode renomear seu .bashrc / .cshrc / .profile / etc. arquivos para outra coisa, para que eles não produzam saída extra. Claro que ainda existem arquivos de sistema que podem causar isso. Nesse caso, verifique com seu sysadmin que os arquivos do sistema não geram dados.

    
por 07.11.2011 / 09:31
15

Existe uma maneira simples de testar se 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 comando false terminará imediatamente sem produzir nenhuma saída, então é 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 será o culpado:

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 este erro é se o rsync está instalado e localizável por 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/
    
por 19.01.2013 / 12:39
7

Isso é comumente causado pelo material de login do seu shell, que gera coisas em um shell não interativo. Você pode testar se esse é o caso:

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

Se o testfile NÃO for 0 bytes, o problema é que seu shell está emitindo algo. Verifique /etc/profile , .profile , .bashrc , .cshrc , etc. Se estiver, você pode alterá-lo para verificar se o seu terminal é interativo e só envia texto usando o seguinte código em um bashrc. Algo equivalente existe para outras shells também:

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

ou, alternativamente, assim, já que o parâmetro especial - contém i quando 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, então 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 (assumindo que é o fim mais recente) não anunciar uma versão tão alta que a versão antiga do servidor rysnc não a reconhece. Você pode fazer isso usando a opção --protocol= . No meu caso, usar --protocol=30 resolveu o problema.

Se você ainda estiver tendo problemas, tente o ssh como o usuário com o qual o rsysnc está se conectando e tente executar rsync --version para ver se o shell pode encontrar o rsync. Se você obtiver algo que diga 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 do final remoto, ler as páginas do manual.

    
por 16.07.2014 / 22:28
4

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

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

Isso pode ser testado com o mesmo comando acima

ssh remotehost false

Este deve falhar e este deve ser um sucesso

sftp remotehost

Isso prova que você tem acesso apenas ao sftp.

Se você quiser e tiver permissões para fazer isso, poderá desabilitar o acesso do sftp somente para esse usuário, editando as entradas /etc/ssh/sshd_config e check match e forcecommand .

Você também pode verificar este postar

    
por 11.06.2013 / 18:11
4

Eu obtive protocol version mismatch -- is your shell clean? simplesmente porque ainda não tinha instalado o rsync no outro fim. sudo yum install rsync resolveu o problema.

    
por 16.09.2016 / 12:33
2

O prompt não será mostrado quando estiver executando diretamente um comando, e de forma não interativa. Um simples google aparece como primeiro resultado: link E como o shell pode potencialmente ser invocado, ele não deve exibir nada no modo não interativo - como, ao digitar apenas "bash" em um prompt existente, nada além do novo prompt deve aparecer.

    
por 06.05.2011 / 23:29
1

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

    
por 01.05.2014 / 01:28