Rsync sobre ssh, funciona muito 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/
incompatibilidade de versão do protocolo - seu shell está limpo? (consulte a página de manual do rsync para obter uma explicação) erro de rsync: incompatibilidade de protocolo (código 2) em compat.c(171) [sender=3.0.6]
Aqui está a seção relevante da página de manual do rsync:
Essa mensagem geralmente é causada por seus scripts de inicialização ou recurso de shell remoto produzindo lixo indesejado no fluxo que o rsync está usando para seu transporte. A maneira de diagnosticar esse problema é executar seu shell remoto assim:
ssh remotehost /bin/true > out.dat
então olhe para out.dat. Se tudo estiver funcionando corretamente, out.dat deve ser um arquivo de comprimento zero. Se você estiver recebendo o erro acima do rsync, provavelmente descobrirá que out.dat contém algum texto ou dados. Olhe para o conteúdo e tente descobrir o que está produzindo. A causa mais comum são scripts de inicialização de shell configurados incorretamente (como .cshrc ou .profile) que contêm instruções de saída para logins não interativos.
Tentar isso no meu sistema produziu o seguinte em out.dat:
ssh-dummy-shell: Comando não permitido.
Como eu pensei, o host não está permitindo logins ssh.
O link a seguir mostra que é possível realizar esta tarefa usando fuse com sshfs - porém é extremamente lento e não adequado para uso em produção.
Existe alguma chance de fazer o rsync sftp funcionar?
Infelizmente não diretamente.
rsync
requer um link limpo com um shell que permitirá iniciar a cópia remota dorsync
, quando executado dessa maneira.Se você tiver 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 acesso adequado ao shell via SSH também, e depende de os arranjos de firewall do host permitindo conexões na porta que você escolheu (e o host que tem o rsync instalado em primeiro lugar). Executar o 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 o host permite scripts em PHP ou similar e não o bloqueia para que processos extras não possam ser
exec
editados por scripts de usuário, você pode tentar iniciar o rsync no modo de escuta dessa maneira. Se o seu fim for conectável (você está executando o SSH acessível ao mundo exterior), você pode tentar isso ao contrário - faça um script executar rsync no servidor, mas em vez de ouvir as conexões de entrada, entre em contato com o serviço local e sincronize dessa maneira. Isso ainda depende da instalação do rsync 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 maneira endereçável publicamente e conversar com ele por um não criptografado canal.Brincar como descrito acima pode ser contra as políticas de hosts, mesmo que funcione, e pode fazer com que você seja expulso. É melhor perguntar se um shell completo pode ser habilitado para essa conta e abandonar o rsync para esse host ou abandonar esse host e mudar para outro lugar se eles não fizerem isso.
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
Teoricamente, sim. Você pode montar o sistema de arquivos remoto em sua máquina local usando FUSE . Em seguida, você pode executar uma cópia local do rsync entre o diretório montado e o diretório local. Eu não tentei isso pessoalmente, mas deve funcionar em teoria. Provavelmente seria muito menos eficiente do que executar o rsync por SSH, pois seria necessário transferir pelo menos parte de cada arquivo para realizar a comparação.
um pouco atrasado, mas aqui está como eu faço isso, usando sshfs
Em vez de Rsync, o rclone suporta sincronização de/para e montagem de compartilhamentos de rede SFTP.
rclone config
e siga as etapas para adicionar uma nova configuração de endpoint remoto. Entradasftp
na seleção de back-end do protocolo.rclone sync local_path remote:remote_path
( documentos )IMO, o rclone fornece uma CLI mais amigável para automação do que o LFTP .
Eu sei que isso não responde à pergunta original, mas provavelmente às necessidades de algumas pessoas que vêm aqui.
Opção que combina o melhor de tudo
Parece ter as seguintes vantagens que outras respostas aqui não têm:
rsync
daemonAinda não testei, mas usei com sucesso todos esses recursos, exceto o
rrsync
.Como fazer isso
ssh-keygen
(recurso openSSH)~/.ssh/authorized_keys
(recurso openSSH)~/.ssh/authorized_keys
(recurso openSSH) usando como comando o scriptrrsync
distribuído com 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 encurtado. Em
~/.ssh/config
crie uma estrofe assim: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
torna-se
Não. O rsync funciona executando o rsync no outro lado e se comunicando com ele, o que significa que alguma forma de acesso ao shell é necessária.
Uma alternativa seria iniciar o rsync como daemon e conectar-se a ele por meio de um túnel SSH.