sudo askpass: pedir de outro tty

6

Contexto

Eu quero configurar rsync backups do meu servidor, então eu corro o seguinte comando

rsync -r -e ssh --rsync-path="sudo rsync" [email protected]:/ /backup/

Idealmente, esse comando perguntaria a minha senha privada da chave ssh, depois conectaria, depois perguntaria a senha sudo para rsyncuser e então executaria o rsync no servidor. Mas eu tenho o erro infame:

sudo: no tty present and no askpass program specified

Então eu tive que adicionar isso a /etc/sudoers (usando sudo visudo ), que basicamente dá acesso total de leitura e gravação sem senha ao sistema para o usuário rsyncuser , o que não é do meu gosto:

rsyncuser ALL= NOPASSWD:/usr/bin/rsync

Pergunta

Como eu posso dizer ao sudo para ler sua senha de, digamos, 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) para o servidor e fornecer a senha sudo lá.

A única maneira de pensar em fazer algo assim seria usar um script expect em torno do sudo, que lê a senha de um pipe nomeado, e eu gravaria nesse pipe a partir do outro terminal.

Nota: isto é mais para promover e aprender do que qualquer propósito prático, Eu não estou tentando descobrir como usar o sudo com o rsync , eu já li tudo o que pude encontrar sobre isso.

    
por Georges Dupéron 19.09.2013 / 00:02

2 respostas

6

sudo lerá uma variável de ambiente, SUDO_ASKPASS , se não estiver sendo executado 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 caso específico do que você está tentando fazer, no entanto, é melhor permitir login SSH root, mas apenas com uma chave SSH e o comando restrito ao rsync. Existe um bom recurso neste aqui .

    
por 19.09.2013 / 01:52
0

Tente:

ssh userfoo@host "sudo -S p'enter pw: ' [command] "

Isso emitirá um prompt de senha (" enter pw: ") que será exibido no seu host / terminal local. A desvantagem disso é o risco de segurança de sua senha ser exibida na tela clara do terminal. Ele não será salvo no seu local .bash_history , mas é o histórico de retrocesso da janela do terminal. Portanto, se você estiver usando o Konsole, por exemplo, use Ctrl + Deslocamento + K para limpar isso.

    
por 27.03.2018 / 13:05