Aqui está a conexão:
[Server1] <---> [my desktop] <---> [Server2]
Servidor1 e servidor2 não têm permissão para falar diretamente entre si (não pergunte). Minha área de trabalho, no entanto, é capaz de acessar os dois servidores via ssh.
Preciso copiar arquivos do servidor1 para o servidor2.
Traiditionally eu tenho usado um hack ssh + tar, como tal:
ssh -q root@Server1 'tar -vzc /path/to/files ' | ssh -q root@Server2 'tar -vzx -C /'
E isso funciona muito bem, mas eu gostaria de dar um passo adiante e fazer com que o rsync funcione entre os dois servidores via meu desktop.
Agora eu sei que poderia iniciar um túnel de encaminhamento de porta ssh em um terminal e sincronizar novamente com o túnel em outra janela, mas não quero mexer com um segundo terminal ou criar e quebrar um túnel de encaminhamento de porta separado. o que eu quero é:
- Um comando de liner para rsync arquivos do Server1 para o server2 via meu desktop
- tudo em UMA linha de comando, uma janela de terminal
- Quero que o túnel de encaminhamento de porta exista apenas durante a vida útil do comando rsync.
- Eu não quero scp, quero rsync.
Alguém tem um truque para fazer isso?
EDIT: Aqui está o comando de trabalho! Bom trabalho a todos: 1. Para o caminho da chave rsa, não é possível usar o tildae, tinha que usar "/ root /". 2. Aqui está a linha de comando final:
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
Boom vai a dinamite.
Respostas:
Se você deseja manter uma cópia dos dados na máquina intermediária, basta escrever um script que atualize a cópia local usando o server1 como referência e atualize o backup no servidor2 usando a cópia local como referência:
Usar um script simples significa que ele desejou um único comando para fazer tudo. É claro que isso pode ser um problema de segurança, se os dados forem sensíveis (você ou outras pessoas da sua empresa talvez não desejem uma cópia flutuando no laptop). Se server1 for local para você, você poderá excluir a cópia local posteriormente (pois será rápida a reconstrução na LAN local na próxima vez).
Construir um túnel para que os servidores possam conversar efetivamente mais diretamente entre si deve ser possível da seguinte maneira:
No servidor 2, crie um script que não faça nada além de fazer um loop em suspensão por alguns segundos e, em seguida, fazer eco de uma pequena quantidade de texto, e faça com que isso use a agora "cópia" de sh:
(
echo
provavelmente não é necessário, pois a sessão não ficará inativa por tempo suficiente, mesmo que o SSHd esteja configurado para ignorar pacotes keep-alive do cliente ssh)Agora você pode escrever um script no seu laptop que inicie o seu túnel reverso em segundo plano, diga ao server1 para usar o rsync para executar a operação de cópia e, em seguida, elimine o túnel reverso matando o script em loop (que fechará a sessão SSH):
Como isso funciona:
Isso não parece particularmente limpo, mas deve funcionar. Eu não testei o acima, então você pode precisar ajustá-lo. Tornar o comando rsync um script de linha única no servidor1 pode ajudar a reduzir qualquer necessidade de escapar caracteres como o 'no comando de chamada ssh.
BTW: você diz "não pergunte" por que os dois servidores não podem se ver diretamente, mas geralmente há uma boa razão para isso. Meu servidor doméstico e o servidor em que seus backups on-line são mantidos não podem se conectar (e possuem senhas + chaves diferentes para todos os usuários) - isso significa que, se um dos dois for invadido, ele não poderá ser usado como uma rota fácil para hackear o outro para que meus backups on-line sejam mais seguros (alguém que deleta meus dados do Live não pode usar sua capacidade de atualizar os backups para excluir os backups, pois não tem capacidade direta de tocar no site principal de backup). Ambos os servidores podem se conectar a um servidor intermediário em outro local - o servidor ativo está configurado para enviar seus backups (via rsync) para a máquina intermediária no início da manhã e o servidor de backup está configurado (um pouco mais tarde para permitir que a etapa 1 seja concluída) para se conectar e colete as atualizações (novamente via rsyc, seguidas de uma etapa de captura instantânea para manter várias idades de backup). Essa técnica também pode ser utilizável em sua circunstância e, nesse caso, eu a recomendaria como uma maneira muito mais limpa de fazer as coisas.
Edit: Mesclando meu hack com o Aaron para evitar toda a confusão com cópias de / bin / sh e um script keep-alive separado no server2, esse script no seu laptop deve fazer todo o trabalho:
Como acima, o rsync está se conectando ao localhost: 2222, que encaminha o túnel ao localhost do seu laptop: 2222, que encaminha o outro túnel ao localhost do servidor2: 22.
Edit 2: Se você não se importa com o server1 com uma chave que permita a autenticação direta com o server2 (mesmo que não consiga ver o server2 sem um túnel), você pode simplificar ainda mais com:
em que 123.123.123.123 é um endereço público do servidor2, que pode ser usado como copiar + colar uma linha em vez de um script.
fonte
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
If you don't mind server1 having a key ...
. Você pode me dizer se é realmente possível evitar ter a chave do server2 no server1, por favor?Aqui estão alguns métodos que tornam a sincronização uma linha única, mas requerem algum trabalho de configuração.
Configure um túnel ssh reverso do server1 para a sua área de trabalho (desculpe, não posso lhe dizer o
.ssh/config
encantamento do topo da minha cabeça). Encadeie-o com uma conexão da área de trabalho ao servidor2. Execute o rsync no server1.Configure um proxy de meias (ou um proxy http que aceite CONNECT) na área de trabalho. Use-o para estabelecer uma conexão ssh do servidor1 para o servidor2. Execute o rsync no servidor2.
Use uníssono em vez de rsync. Mas o fluxo de trabalho é diferente.
Monte os diretórios de um ou dos dois servidores na área de trabalho usando sshfs .
fonte
Por que uma linha? Use um pequeno script de shell:
IIRC, você pode definir o tempo de sono mais baixo; o primeiro
ssh
não terminará enquanto alguém usar o canal.fonte
sleep
e atrap
limpeza sejam mais agradáveis do que o método "manter vivo e matar" na minha resposta .