“incompatibilidade de versão do protocolo - o seu shell está limpo?” Erro de rsync quando o shell está limpo

3

Estou tentando baixar arquivos usando o rsync com o rsync em execução no modo daemon por SSH no servidor e obter o seguinte erro no cliente:

rsync -a myserver:/remote/path/ localdestdir/
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(176) [Receiver=3.1.1]

O servidor tem isso em .ssh / authorized_keys para o usuário:

command="rsync --config=/path/to/engine-rsyncd.conf --server --daemon ." ssh-rsa ...

Eu li tudo o que consegui encontrar sobre esse problema e, como todos sugerem, verifiquei se o shell está limpo e ESTEJA LIMPO :

ssh myserver false >out.tmp

cria um arquivo de comprimento zero out.tmp (se eu remover o "command = ..." de authorized_keys no servidor).

Eu também tentei configurar o shell do usuário para o rssh em vez de bash no servidor - a mesma coisa.

O cliente e o servidor estão executando o Ubuntu 16.04, então eles têm a mesma versão do rsync (3.3.1, protocolo 31).

O que mais poderia ser? Eu tentei ativar o log detalhado em rsync e SSH e os logs não me dão nenhuma pista. O daemon rsync não registra nada mais que

2018/02/12 15:14:24 [6215] connect from clienthostname
    
por EM0 12.02.2018 / 16:16

1 resposta

1

Seu problema neste caso não é que o shell não esteja limpo, mas que o cliente rsync possa executar o comando que precisa executar no servidor. Se você usar o command="rsync..." em authorized_keys, então esse é o comando que o sshd executará, independentemente do comando que é passado pelo cliente.

O cliente rsync irá chamar o ssh com estes argumentos:

ssh myserver rsync --server --sender -de.LsfxC . /remote/path/'.

Observe que --sender faz parte dessas opções, porque você deseja que o servidor envie arquivos para você. Não está presente se o servidor deve receber arquivos. Observe também que --daemon não está presente nas opções do rsync. Como a opção --config só é relevante junto com --daemon , ela também pode ser removida da sua entrada de comando.

Já estou mencionado, o comando será executado exatamente como está no arquivo authorized_keys. Isso significa que todos os argumentos que são passados do cliente serão ignorados. Portanto, se você realmente quiser usar o comando em authorized_keys, precisará especificar as opções exatas que o rsync forneceria ao cliente ssh, o que significa que você pode usar o rsync apenas para receber arquivos exatamente do caminho especificado em authorized_keys. Se você fornecer opções diferentes para o rsync no cliente, elas não serão efetivas no servidor e, portanto, poderão ou não funcionar, dependendo de o efeito dessas opções ser implementado no cliente ou no servidor do rsync. Então você deve considerar se realmente quer isso.

Editar Você pode usar um script como o comando e examinar a variável de ambiente SSH_ORIGINAL_COMMAND para chamar o rsync conforme necessário. Como o caminho remoto é o último argumento, você pode querer apenas verificar se ele inicia com o prefixo direito e não contém nenhum "/ .." que iria para o diretório pai.

    
por 19.07.2018 / 20:00