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
Respostas:
Experimente esta solução. No arquivo sudoers (
/etc/sudoers
), configure seu usuário assim:o
NOPASSWD:/usr/bin/rsync
informasudo
que quando o usuário executa/usr/bin/rsync
ou apenasrsync
que nenhuma senha é necessária.Então o seu original
--rsync-path="sudo rsync"
deve funcionar.fonte
Esta é a solução que eu vim com:
Um pouco de uma missão!
fonte
ps aux
). Testersync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/example
:, abra o terminal na máquina remota eps aux | grep find
.find /
é usado apenas porque é a primeira coisa que me vem à mente com grande duração de execução.A solução deste blog funcionou muito bem para mim: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .
Basicamente:
A primeira linha permite a entrada de senha interativa, sem mostrar a senha na tela. Funciona muito bem para mim no Ubuntu 9.04.
fonte
!tty_tickets
.ssh -t [other options]
vez de brincarstty -echo
?tty_tickets
enfim ... para que eu possa tentar essa abordagem.sudo: no tty present and no askpass program specified
Você precisa de um método para fornecer a senha
sudo
. Umaskpass
programa foi projetado para solicitar senhas quando os mecanismos normais não estão disponíveis. A configuraçãosudo
para não exigir uma senha para ser executada,rsync
pois 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
rsync
como raiz, esse tipo de coisa ficará mais fácil. Outra alternativa é usar umrsycnd
processo 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.
fonte
na máquina remota
depois na máquina local
caminho substituto para ssh-askpass pelo caminho real na máquina remota
fonte: http://unix.bris.ac.uk/2015/08/04/rsync-between-two-hosts-using-sudo-and-a-password-prompt/
fonte
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 .
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.
fonte
Aqui está o que funcionou para mim, considerando que eu quero manter a autenticação por senha (para não usar
NOPASSWD
chaves ou) - no Ubuntu 14.04:sudo
na máquina remota desativandotty_tickets
atravé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"rsync
comsudo
como mostrado em outras respostassudo
na máquina remota removendo o arquivo temporário/etc/sudoers.d/
, que reativatty_tickets
... ou, com linhas de comando:
Estas são as respostas que recebo ao executar estes comandos na máquina local:
Observe que
sudo -v
deve ser executado após cada vez que os arquivos/etc/sudoers.d/
são inseridos, para que as alterações sejam aceitas.fonte
Outro método é contornar as restrições de permissões iniciando o rsync na máquina remota. Ao invés de:
Você pode fazer:
Onde
y.y.y.y
está o endereço IP da sua máquina local. Isso funciona apenas se sua máquina local puder atuar como um servidor SSH.fonte
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"
fonte