O Rsync parece incompatível com .bashrc (causa “seu shell está limpo?”)

15

Acontece que o rsync não pode funcionar com um servidor remoto que possui um arquivo .bashrc?

No cliente local que tenho quando executo o rsync:

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(180) [sender=3.0.7]

Como sugerido aqui , remover o .bashrc no servidor resolveu o problema . Como resolvê-lo sem remover o arquivo .bashrc (temporariamente)?

    
por Computist 23.08.2011 / 02:11

5 respostas

18

Você pode ter problemas se o .bashrc no servidor remoto emitir alguma coisa para o terminal. O Rsync pode não esperar isso e pode ter problemas como resultado.

Você pode corrigir isso removendo todos os comandos no .bashrc do texto de saída ou canalizando qualquer saída para / dev / null.

    
por 23.08.2011 / 02:17
7

O .bashrc não é realmente o lugar correto para gerar saída, pois causa esse tipo de problema. Muitas pessoas se safam disso até que tentem executar o rsync: -)

Qualquer saída desejada (e a lógica e os comandos associados) devem ser movidos para o seu .bash_profile (consulte, por exemplo, Pergunta de falha do servidor " .profile vs. .bash_profile vs. .bashrc " para uma discussão mais aprofundada sobre as diferenças entre os arquivos).

Dessa forma, você não precisará se sacrificar para obter a saída quando fizer o login, nem lidar com alterações temporárias no seu .bashrc quando quiser usar o rsync.

    
por 06.09.2011 / 18:10
6

Eu sempre tive arquivos .bashrc em minhas contas de usuário e nunca tive esse problema até que tentei hoje rsync algo para o meu servidor usando a conta root. Sua postagem me ajudou a encontrar a solução:

Meus arquivos $ user / .bashrc sempre começam com a seção a seguir para evitar esse tipo de problema. Eu repliquei para o .bashrc do root e o rsync'ing agora funciona como um encanto!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

HTH, karsten

    
por 29.06.2014 / 21:18
3

Para motivos complexos , o rsync / scp / sftp executa .bashrc ao se conectar a outro host. Você deve ter qualquer um desses comandos no topo do seu .bashrc :

ou

[[ $- != *i* ]] && return

ou

[ -z "$PS1" ] && return

Qualquer um dos comandos acima só permitirá a execução do resto dos comandos .bashrc para sessões interativas . Até onde eu sei, você não precisa deles para nenhum outro tipo de sessão (e de fato eu vi o padrão bashrc do Arch e do Debian usando essa técnica em seu bashrc).

Se, no entanto, você quiser ser mais paranóico em permitir que seus comandos bashrc sejam executados mesmo para sessões não interativas, você deve pelo menos agrupar os comandos do bashrc que produzem uma saída como essa ( referência ) para que eles sejam executados somente em sessões interativas:

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...code that produces output goes here...
fi

Observe que outras pessoas sugerem a movimentação de comandos que geram texto para o seu bash_profile, mas tenho minhas dúvidas sobre se isso é sempre bom (para razões explicadas aqui )

    
por 27.09.2016 / 10:23
-1
Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh: Could not resolve hostname tty: Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.1]

Eu passei muito tempo até que eu achei isso "-t tty" me ajudou.

rsync -e "ssh -t tty -i key.pem"  ...
    
por 24.06.2017 / 14:46

Tags