![Contexto](https://rvso.com/image/50564/Contexto.png)
Contexto
Quero configurar rsync
backups do meu servidor, então executo o seguinte comando
rsync -r -e ssh --rsync-path="sudo rsync" [email protected]:/ /backup/
Idealmente, esse comando solicitaria a senha da minha chave ssh privada, conectaria, solicitaria a senha sudo para rsyncuser e executaria o rsync no servidor. Mas recebi o erro infame:
sudo: no tty present and no askpass program specified
Então eu tive que adicionar isso a /etc/sudoers
(using sudo visudo
), que basicamente dá ao usuário acesso completo de leitura e gravação sem senha ao sistema rsyncuser
, o que não é do meu gosto:
rsyncuser ALL= NOPASSWD:/usr/bin/rsync
Pergunta
Como posso dizer ao sudo para ler sua senha, digamos, de outro TTY?
Dessa forma, eu poderia executar rsync
em uma janela de terminal em minha máquina local e usar outra janela de terminal para abrir uma conexão ssh (possivelmente separada) com o servidor e fornecer a senha sudo lá.
A única maneira de fazer algo assim seria usar um expect
script em torno do sudo, que lê a senha de um canal nomeado, e eu escreveria nesse canal a partir do outro terminal.
Nota: isso é mais para fins de experimentação e aprendizado do que qualquer propósito prático,Não estou tentando descobrir como usar o sudo com o rsync, já li tudo o que pude encontrar sobre isso.
Responder1
sudo
irá ler uma variável de ambiente, SUDO_ASKPASS
se ela não estiver sendo executada em um terminal (como no seu caso) ou se -A estiver definido. Ele usa isso como um comando para executar para obter a senha. Por exemplo:
echo -e '#!/bin/sh\nhead -n 1' > ~/bin/reader
chmod a+x ~/bin/reader
export SUDO_ASKPASS="$HOME/bin/reader"
sudo -A echo "I'm root\!"
Solicitará a senha no stdin e não exigirá um terminal.
No entanto, no caso específico do que você está tentando fazer, talvez seja melhor permitir o login SSH root, mas apenas com uma chave SSH e o comando restrito ao rsync. Existe um bom recurso sobre issoaqui.
Responder2
Tentar:
ssh userfoo@host "sudo -S p'enter pw: ' [command] "
Isso emitirá um prompt de senha (" enter pw:
") que será exibido em seu host/terminal local. A desvantagem disso é o risco de segurança de sua senha ser exibida de forma clara na janela do terminal. Ele não será salvo em seu local .bash_history
, mas é o histórico de rolagem da janela do terminal. Então, se você estiver usando o Konsole, por exemplo, use Ctrl+ Shift+ Kpara limpar isso.