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

53

O rsync sobre o ssh funciona bem todas as vezes.

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

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

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

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

This message is usually caused by your startup scripts or remote shell facility producing unwanted garbage on the stream that rsync is using for its transport. The way to diagnose this problem is to run your remote shell like this:

          ssh remotehost /bin/true > out.dat

then look at out.dat. If everything is working correctly then out.dat should be a zero length file. If you are getting the above error from rsync then you will probably find that out.dat contains some text or data. Look at the contents and try to work out what is producing it. The most com‐ mon cause is incorrectly configured shell startup scripts (such as .cshrc or .profile) that contain output statements for non-interactive logins.

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

ssh-dummy-shell: Command not allowed.

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

O seguinte link 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?

    
por Tom Feiner 25.04.2010 / 13:07

7 respostas

38

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

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

Se você hospeda permite scripting em PHP ou similar e não tem isso bloqueado para que processos extras não possam ser exec ed por scripts de usuário, então você pode tentar iniciar o rsync em modo de escuta dessa maneira. Se o seu terminal for conectável (você está executando o SSH acessível ao mundo externo), tente fazer isso inversamente - faça um script executar o rsync no servidor, mas em vez de ouvir conexões de entrada, entre em contato com o serviço local e sincronize dessa maneira. Isso ainda depende do fato de o rsync estar sendo instalado no host que não é fornecido, 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 conversando com ele sem criptografia. canal.

Brincar conforme 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 esse host e mover-se para outro lugar se ele não fizer isso.

    
por 25.04.2010 / 13:39
18

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 deveria funcionar em teoria. Provavelmente seria muito menos eficiente executar o rsync via SSH, pois seria necessário transferir pelo menos parte de cada arquivo para realizar a comparação.

    
por 25.04.2010 / 17:59
5

um pouco atrasado, mas aqui está como eu faço, 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
    
por 20.09.2011 / 14:04
4

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
    
por 31.03.2018 / 12:13
2

Não. O rsync funciona executando o rsync do outro lado e comunicando-se com ele, o que significa que é necessário algum tipo de acesso ao shell.

    
por 25.04.2010 / 13:23
2

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

    
por 25.04.2010 / 14:17
0

Opção combinando o melhor de todos

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

  • beneficia totalmente do SSH (seguro)
  • se beneficia totalmente do rsync (protocolo de 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 shell arbitrários no lado do servidor
  • não precisa de servidor para permitir túneis ssh
  • não precisa de servidor para executar um daemon rsync

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

Como fazer

  • crie uma chave localmente com ssh-keygen (recurso openSSH)
  • permite o login somente com essa chave específica, com uma entrada no ~/.ssh/authorized_keys (recurso openSSH) do servidor
  • associe essa chave a um comando específico, com ~/.ssh/authorized_keys (recurso openSSH) usando como comando o script rrsync distribuído com o rsync, algo como command="$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 SSH Acesso ao rsync | Guy Rutenberg

Um passo além do link acima

O comando no final dessa página pode ser reduzido. Em ~/.ssh/config , crie 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/
    
por 08.01.2018 / 11:04