Execute o rsync com permissão de root na máquina remota

31

Quero sincronizar uma pasta da minha máquina com uma pasta em uma máquina remota. A pasta remota pode ser manipulada apenas por root. Eu tenho uma conta na máquina remota que pode ser usada sudo. Como posso executar o rsync de modo que ele tenha permissões de root na máquina remota?

Eu tentei o seguinte:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="sudo rsync"

Mas (depois de inserir minha senha), recebo o seguinte erro:

sudo: no tty present and no askpass program specified
Pedro
fonte
Você não pode alterar as permissões na pasta remota para que seu usuário tenha acesso de gravação a ela?
Phil
11
Infelizmente isso não é uma opção.
Peter
É muito melhor verificar a resposta na mesma pergunta no Unix SE unix.stackexchange.com/questions/92123/… .
Ndemou

Respostas:

12

Experimente esta solução. No arquivo sudoers ( /etc/sudoers), configure seu usuário assim:

username ALL= NOPASSWD:/usr/bin/rsync

o NOPASSWD:/usr/bin/rsyncinforma sudoque quando o usuário executa /usr/bin/rsyncou apenas rsyncque nenhuma senha é necessária.

Então o seu original --rsync-path="sudo rsync"deve funcionar.

dynabaul
fonte
Usei a opção sudo rsync sem definir o nome de usuário ALL ... depois que o rsync foi concluído. no controle remoto quando tento cd ou sl. Recebo permissão negada. mesmo sendo raiz. Eu tenho que sudo para sl. mas no caso do cd ainda não é possível. Eu tentei mostrar todos os diretórios e arquivos. ainda não funcionou. alguém sabe o motivo e como corrigi-lo?
Temido ponto-e-vírgula
2
você também deve dizer como editar o arquivo sudoers
Jonathan
2
Consulte unix.stackexchange.com/a/92397/128237 para obter implicações de segurança dessa correção.
precisa
11

Esta é a solução que eu vim com:

rsync -R -avz -e ssh --rsync-path="echo mypassword | sudo -S  mkdir -p /remote/lovely/folder && sudo rsync" /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete

Um pouco de uma missão!

Pedro
fonte
12
Espero que você reconheça sua senha estará visível na linha de comando. Ele deve ficar visível durante o tempo em que o rsync estiver em execução.
BillThor
11
onde a senha está visível? Apenas na caixa local na linha de comando? Ou essa abordagem também cria vulnerabilidades remotas? Estou tentando entender a resposta acima e as implicações do uso desta solução. Eu fiz uma pergunta aqui: superuser.com/questions/398146/…
MountainX
@MountainX Será visível na lista de processos (por exemplo ps aux). Teste rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/example:, abra o terminal na máquina remota e ps aux | grep find. find /é usado apenas porque é a primeira coisa que me vem à mente com grande duração de execução.
Ivan Vučica
11
Sei que isso é antigo, mas, se você quiser evitar a senha no comando, pode usar as chaves para ssh e, na máquina remota, adicione seu usuário ao arquivo sudoers com o sinalizador NOPASSWD: ALL. Veja a resposta de classificação mais alta no link a seguir. NOTA: Não é a resposta aceita: askubuntu.com/questions/147241/execute-sudo-without-password
Dave
10

A solução deste blog funcionou muito bem para mim: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

Basicamente:

stty -echo; ssh myUser@REMOTE_SERVER "sudo -v"; stty echo  
rsync -avze ssh --rsync-path='sudo rsync' myUser@REMOTE_SERVER:/REMOTE_PATH/ LOCAL_PATH 

A primeira linha permite a entrada de senha interativa, sem mostrar a senha na tela. Funciona muito bem para mim no Ubuntu 9.04.

Andrew
fonte
11
Isto requer a opção tty_tickets ser desactivado: !tty_tickets.
blueyed
2
Que tal em ssh -t [other options]vez de brincar stty -echo?
Ivan Vučica
No meu caso, já desabilitei: tty_ticketsenfim ... para que eu possa tentar essa abordagem.
MountainX
11
sudo: no tty present and no askpass program specified
Michael
Como alguém desativa o tty_tickets? Em qual máquina? Durante este comando rsync?
Jonathan
4

Você precisa de um método para fornecer a senha sudo. Um askpassprograma foi projetado para solicitar senhas quando os mecanismos normais não estão disponíveis. A configuração sudopara não exigir uma senha para ser executada, rsyncpois o ID do usuário é uma opção.

Normalmente, configuro o login baseado em chave com restrições apropriadas para casos como este. Se você configurar uma chave restrita que apenas seja executada rsynccomo raiz, esse tipo de coisa ficará mais fácil. Outra alternativa é usar um rsycndprocesso para lidar com as solicitações remotas. A configuração fornece uma variedade de restrições que podem ser aplicadas.

EDIT: Incluí um script para configurar chaves para loings baseados em chave na seção Criando IDs de Usuário em Clientes da minha publicação sobre Configurando o BackupPC no Linux . Consulte também a documentação do ssh_config, que detalha algumas das ações que você pode fazer para restringir o uso de chaves, conforme mostrado no script.

BillThor
fonte
Obrigado pela ajuda, mas encontrei uma solução que funciona melhor para mim.
Peter
algum detalhe sobre o login baseado em chave?
TheVillageIdiot
2

Estou impressionado com a complexidade das respostas existentes. É muito mais fácil e conveniente configurar seus sistemas (seu PC e o host remoto) para que você possa se conectar como root ao host remoto sem usar uma senha. E, diferentemente da aparência, também é seguro .

  1. No host remoto, verifique se / etc / ssh / sshd_config possui esta linha "PermitRootLogin sem senha" (em muitas distribuições, ela está por padrão). Isso permite que o root obtenha um shell ssh usando qualquer método de autenticação, exceto o prompt de senha não segura.
  2. (Se você ainda não sabe como) siga qualquer um dos muitos tutoriais sobre como obter login sem senha via ssh
  3. Use o rsync como faria normalmente e sem nenhum aviso de senha.

Apenas não esqueça que, enquanto a linha em /root/.ssh/authorized_keys do host remoto estiver lá, a máquina aceitará os comandos root do seu PC.

ndemou
fonte
O rrsync usa essa abordagem.
COD-REaD 18/04
0

Aqui está o que funcionou para mim, considerando que eu quero manter a autenticação por senha (para não usar NOPASSWDchaves ou) - no Ubuntu 14.04:

  • "Abra" sudona máquina remota desativando tty_ticketsatravés de um arquivo temporário no /etc/sudoers.d/(que deve ser suportado no Debian, consulte /etc/sudoers.d/README) e "Atualize as credenciais em cache do usuário", que "prolonga o tempo limite do sudo por mais 15 minutos"
  • Execute o rsynccom sudocomo mostrado em outras respostas
  • "Fechar" sudona máquina remota removendo o arquivo temporário /etc/sudoers.d/, que reativatty_tickets

... ou, com linhas de comando:

ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'

Estas são as respostas que recebo ao executar estes comandos na máquina local:

$ ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
[sudo] password for remoteuser: 
Defaults !tty_tickets
Connection to $REMOTEPC closed.

$ rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
remoteuser@$REMOTEPC's password: 
sending incremental file list
client.conf
           1269 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

$ ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
removed ‘/etc/sudoers.d/temp’
[sudo] password for remoteuser: 
Connection to $REMOTEPC closed.

Observe que sudo -vdeve ser executado após cada vez que os arquivos /etc/sudoers.d/são inseridos, para que as alterações sejam aceitas.

sdaau
fonte
0

Outro método é contornar as restrições de permissões iniciando o rsync na máquina remota. Ao invés de:

rsync /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder

Você pode fazer:

ssh [email protected] 'rsync [email protected]:/home/ubuntu/my/lovely/folder /remote/lovely/folder'

Onde y.y.y.yestá o endereço IP da sua máquina local. Isso funciona apenas se sua máquina local puder atuar como um servidor SSH.

Keith
fonte
11
Hum ... você não está copiando local para remoto na sua primeira linha de comando - e depois na segunda linha de comando, que deve ser equivalente à primeira, copiando remota para local (que não é equivalente à primeira)?
Sdaau
Ops! Corrigido.
Keith
0

Minha solução alternativa é adicionar --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

exemplo:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | sudo -Sv && sudo rsync"

Geralmente, não é uma boa ideia colocar senhas em uma linha de comando; eles se tornam visíveis na árvore de processos, por exemplo. Às vezes, substituo a senha real neste tipo de instrução por $ (cat my_password.txt), que é um pouco melhor

rsync -avz -e ssh /home/ubuntu/my/lovely/folder [email protected]:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"

Bulat
fonte
Você pode expandir isso com um pouco de contexto e explicação? "adicionar" a quê, onde? Por que isso resolve o problema? Obrigado.
precisa saber é o seguinte