Esta é a solução que eu criei:
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
Pouco de uma missão!
Eu quero sincronizar uma pasta da minha máquina com uma pasta em uma máquina remota. A pasta remota só pode ser manipulada por root
. Eu tenho uma conta na máquina remota que pode usar sudo
. Como posso executar o rsync de forma 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 digitar minha senha, recebo o seguinte erro:
sudo: no tty present and no askpass program specified
Esta é a solução que eu criei:
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
Pouco de uma missão!
A solução neste blog funcionou muito bem para mim: link .
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 no Ubuntu 9.04.
Tente esta solução. Em seu arquivo sudoers ( /etc/sudoers
), configure seu usuário assim:
username ALL= NOPASSWD:/usr/bin/rsync
o NOPASSWD:/usr/bin/rsync
informa sudo
que, quando o usuário executa /usr/bin/rsync
ou apenas rsync
, nenhuma senha é necessária.
Então o seu --rsync-path="sudo rsync"
original deve funcionar.
Você precisa de um método para fornecer a senha para sudo
. Um programa askpass
foi projetado para solicitar senhas quando os mecanismos normais não estão disponíveis. Configurar sudo
para não exigir uma senha para executar rsync
, já que seu ID do usuário é uma opção.
Eu normalmente configuro login baseado em chave com restrições apropriadas para casos como este. Se você configurar uma chave restrita que execute somente rsync
como root, esse tipo de coisa fica mais fácil de ser feito. Outra alternativa é usar um processo rsycnd
para manipular as solicitações remotas. A configuração fornece uma variedade de restrições que podem ser aplicadas.
EDIT: Eu incluí um script para configurar chaves para loops baseados em chave na seção Criando Userids em Clientes do meu post em Configurando o BackupPC no Linux . Veja também a documentação do ssh_config que detalha algumas das coisas que você pode fazer com o restabelecimento do uso da chave, conforme mostrado no script.
na máquina remota
sudo apt install ssh-askpass
which ssh-askpass
então na máquina local
rsync -av -e 'ssh -X' --rsync-path='SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass sudo -A rsync' /some/local/path user@remote:/some/remote/path
caminho substituto para ssh-askpass com caminho real na máquina remota
fonte: link
Estou espantado com a complexidade das respostas existentes. É distante mais fácil e conveniente para 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 ao contrário da aparência do também é seguro .
Apenas não se 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.
Aqui está o que funcionou para mim, considerando que eu quero manter a autenticação de senha (por isso não quero usar NOPASSWD
ou chaves) - no Ubuntu 14.04:
sudo
na máquina remota desabilitando tty_tickets
através de um arquivo temporário em /etc/sudoers.d/
(que deve ser suportado no Debian, veja /etc/sudoers.d/README
), e "Atualizar as credenciais em cache do usuário", que "prolonga o tempo limite do sudo por mais 15 minutos" rsync
com sudo
, conforme mostrado em outras respostas sudo
na máquina remota, removendo o arquivo temporário em /etc/sudoers.d/
, que reativa tty_tickets
... ou, com as 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 esses 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 -v
deve ser executado após cada vez que houver arquivos em /etc/sudoers.d/
, portanto, as alterações são aceitas.
Outro método é contornar as restrições de permissões iniciando o rsync na máquina remota. Em vez 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.y
é o endereço IP da sua máquina local. Isso só funciona se a sua máquina local puder atuar como um servidor SSH.
Meu trabalho é 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 as senhas em uma linha de comando; eles se tornam visíveis na árvore de processos, por exemplo. Eu às vezes substituo a senha real neste tipo de declaração com $ (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"