É possível usar o rsync sobre sftp (sem um shell ssh)?


60

Rsync sobre ssh, funciona muito bem sempre.

No entanto, tentar rsync para um host que permita apenas logons sftp, mas não logins ssh, fornece o seguinte erro:

rsync -av / source ssh user @ remotehost: / target /

incompatibilidade de versão do protocolo - seu shell está limpo? (consulte a página do manual rsync para obter uma explicação). Erro rsync: incompatibilidade de protocolo (código 2) em compat.c (171) [remetente = 3.0.6]

Aqui está a seção relevante da página de manual do rsync:

Essa mensagem geralmente é causada pelos scripts de inicialização ou pelo recurso remoto do shell, produzindo lixo indesejado no fluxo que o rsync está usando para seu transporte. A maneira de diagnosticar esse problema é executar o shell remoto assim:

          ssh remotehost /bin/true > out.dat

então veja out.dat. Se tudo estiver funcionando corretamente, out.dat deve ser um arquivo de tamanho zero. Se você está recebendo o erro acima do rsync, provavelmente encontrará que o out.dat contém algum texto ou dados. Observe o conteúdo e tente descobrir o que está produzindo. A causa mais comum são os scripts de inicialização do shell configurados incorretamente (como .cshrc ou .profile) que contêm instruções de saída para logons não interativos.

Tentar isso no meu sistema produziu o seguinte em out.dat:

ssh-dummy-shell: comando não permitido.

Como eu pensava, o host não está permitindo logins ssh.

O link a seguir mostra que é possível realizar essa tarefa usando o fusível com sshfs - no entanto, é extremamente lento e não é adequado para uso em produção.

Existe alguma chance de fazer o rsync sftp funcionar?


3
O lftp fará o truque. I irá sincronizar local para remoto com a opção -R

Você sabe como os comandos são restritos no servidor? Se for configurando o ForceCommand em sshd_config, verifique se é possível modificar o arquivo que aponta para. Ou, se for definido pelo comando em allowed_keys, talvez você possa acessar o author_keys através do sshfs e alterá-lo?
ptman

Você pode tentar csync : csync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csyncveja esta resposta .
Nachtigall 6/09/14

6
Eventualmente, eu fiz isso com o lftp :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall

@nachtigall você sabe como usar o lftp com vários arquivos de entrada / uma lista de arquivos e diretórios?
bortran

Respostas:


39

Infelizmente não diretamente. rsyncrequer um link limpo com um shell que permita iniciar a cópia remota de rsync, quando executado dessa maneira.

Se você tem alguma maneira de executar processos de escuta de longa duração no host, tente iniciar o rsync escutando manualmente as conexões em uma porta não privilegiada, mas a maioria das técnicas para fazer isso exigiria também acesso adequado ao shell via SSH, e depende os arranjos de firewall dos hosts que permitem conexões na porta que você escolheu (e o host com o rsync instalado em primeiro lugar). A execução do rsync como um serviço publicamente endereçável (em vez de indiretamente via SSH ou similar) geralmente não é recomendada para dados não públicos.

Se o seu host permitir scripts em PHP ou similar e não o bloquear, para que processos extras não possam ser execeditados pelos scripts do usuário, tente iniciar o rsync no modo de escuta dessa maneira. Se o seu final for conectável (você está executando o SSH acessível ao mundo externo), tente o contrário - faça com que um script execute rsync no servidor, mas em vez de ouvir as conexões recebidas, entre em contato com o serviço local e sincronize dessa maneira. Isso ainda depende do fato de o rsync estar realmente instalado no host que não é um dado, ou que você pode fazer upload de uma cópia de trabalho, mas não tem as implicações de segurança de executar um daemon rsync de forma endereçável publicamente e conversar com ele por meio de uma criptografia não criptografada. canal.

Brincar como descrito acima pode ser contra as políticas de hosts, mesmo que funcione, e você pode ser expulso. É melhor você perguntar se um shell completo pode ser ativado para essa conta e abandonar o rsync para esse host ou abandonar o host e mudar para outro lugar, caso não o façam.


2
Observe que não precisa ser um shell completo; ele apenas precisa permitir que o comando rsync com os argumentos adequados seja executado. scponly é útil para isso.
sciurus

19

Teoricamente, sim. Você pode montar o sistema de arquivos remoto em sua máquina local usando o FUSE . Em seguida, você pode executar uma cópia local do rsync entre o diretório montado e o diretório local. Eu pessoalmente não tentei isso, mas deve funcionar em teoria. Provavelmente seria muito menos eficiente que executar o rsync sobre SSH porque seria necessário transferir pelo menos parte de cada arquivo para realizar a comparação.


11
Isso deve funcionar quando a comparação de timestamp + tamanho for suficiente para decidir o que precisa ser enviado. Assim que for necessária uma soma de verificação, o arquivo remoto inteiro será lido por toda a linha, bem como as atualizações enviadas, portanto, verifique se as opções do rsync estão definidas de forma que ele faça tudo ou nada para cada arquivo (não usando --ignore- times ou --checksum e ter --whole-file especificado podem ser suficientes). Algumas opções como --link-dest são altamente improváveis ​​de funcionar corretamente (ou de todo) dessa maneira.
David Spillett

Obrigado por adicionar alguns detalhes David. Esse é o tipo de limitações na eficiência Eu estava pensando em, simplesmente não articulá-los tão bem :)
Kamil Kisiel

É uma solução alternativa com limitações, sim, mas é bom o suficiente se não há nenhuma maneira para invocar rsync "adequada"
Valery Lourie

10

Uma alternativa ao uso do rsync é usar o lftp (que pode se conectar ao sftp) e usar o comando mirror. Por exemplo, pode-se fazer

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit

11
Embora este post não responda à pergunta, ele fornece uma alternativa útil
Dmitri Chubarov 04/04

6

um pouco tarde, mas aqui está como eu faço isso, usando sshfs

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt

3
Como @David Spillett diz em seu comentário sobre uma resposta anterior ( serverfault.com/questions/135618/… ), isso funcionará, mas é um pouco de uso ineficiente do protocolo rsync.
Evan Anderson

2
Jonathan, acho que sua solução está errada. Se você montar uma unidade remota e executar o rsync como se fosse sincronizar duas pastas locais, sempre haverá tudo transferido na sincronização, pois o processo do rsync na máquina local calcula os valores de hash dos arquivos remotos. Isso significa que o arquivo inteiro é transferido e os benefícios do rsync são perdidos. Edit: ah, essa resposta foi dada várias vezes ... sry para replicação: D
Thekwasti

2

Não. O rsync funciona executando o rsync do outro lado e se comunicando com ele, o que significa que é necessária alguma forma de acesso ao shell.


2

Uma alternativa seria iniciar o rsync como daemon e conectar-se a ele através de um túnel SSH.


Esta resposta é muito curta para ser completamente útil, mas se o lado do servidor não puder permitir acesso ao shell, mas permitir (1) um servidor rsync escutando localmente (não disponível externamente, por segurança) e (2) ssh tunnel, em seguida, em princípio, pode-se efetuar login no servidor através de uma regra authorized_keysque permita um túnel específico e execute, por exemplo sleep 86400. Então o lado do cliente poderia então rsyncatravés do túnel.
Stéphane Gourichon

2

Opção que combina o melhor de tudo

Parece ter as seguintes vantagens que outras respostas aqui não têm:

  • se beneficia totalmente do SSH (seguro)
  • se beneficia totalmente do rsync (protocolo com largura de banda eficiente, todas as opções de rsync, como limitação de largura de banda)
  • realmente eficiente (ao contrário do sshfs que salva os dias às vezes, mas ainda é lento na prática)
  • não precisa de comandos arbitrários do lado do servidor
  • não precisa de servidor para permitir túneis ssh
  • não precisa de servidor para executar um rsyncdaemon

Ainda não testei, mas usei com sucesso todos esses recursos, exceto rrsync.

Como fazer isso

  • crie uma chave localmente com ssh-keygen(recurso openSSH)
  • permitir login apenas com essa chave específica, com uma entrada no servidor ~/.ssh/authorized_keys(recurso openSSH)
  • associe essa chave a um comando específico, com ~/.ssh/authorized_keys(recurso openSSH), usando como comando o script rrsyncdistribuído com o rsync, algo comocommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Então você pode rsync do cliente normalmente.

Se você precisar de mais detalhes

Restringindo o acesso SSH ao rsync | Guy Rutenberg

Um passo além do link acima

O comando no final dessa página pode ser reduzido. Em ~/.ssh/configcriar uma estrofe como esta:

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

então seu comando rsync do cliente

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

torna-se

rsync -av user@remote: etc2/

11
Infelizmente, isso não tem nada a ver com o uso do rsync com um servidor SFTP, trata-se de configurar um servidor OpenSSH para permitir rsynca execução, evitando o aspecto do SFTP. Se você receber um servidor SFTP de outra pessoa sobre o qual você não tem controle, esta resposta não poderá solucionar o problema.
Malvineous 7/09/18

Você está certo. Na verdade, eu poderia ter escrito isso para responder a outra pergunta e postado aqui por engano. Estou pensando em remover minha resposta aqui.
Stéphane Gourichon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.