SSH: execute o comando sudo

44

Eu tenho um shell script interativo, que em um local precisa ssh para outra máquina (baseada no Ubuntu) e executar algo como root (o usuário deve digitar sua senha, mas o comando remoto deve executar como observado no script):

# ...
ssh remote-machine 'sudo ls'
# ...

No entanto, sempre recebo essa mensagem de erro de volta:

sudo: no tty present and no askpass program specified

OK, está bem claro. Mas como posso contornar isso? Algo assim deve acontecer:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var
Boldewyn
fonte

Respostas:

52

O maravilhoso sshtem uma cura para tudo. O objetivo é adicionar o -tsinalizador para forçar o ssh a alocar um pseudo-tty:

ssh -t remote-server 'sudo ls'
Boldewyn
fonte
11
Os PTYs podem atrapalhar as coisas com os scripts, no entanto. lsa saída conterá \ r \ n finais, por exemplo.
Tobu
11
A maneira mais fácil de contornar isso é forçar sl no modo não terminal. ls | catvai fazer - vai ver que stdout é um cachimbo. Nesta questão específica, isso não é relevante, pois aparentemente pretende ser executado de forma interativa a partir de um terminal - então você provavelmente deseja as colunas e as cores e outros enfeites.
Gabe
0

Este método executará um único script usando o sudo após o ssh:

Vamos supor que temos um usuário "remoto" com recursos de sudo e temos um script que queremos que seja executado como root.

1) Defina um script em / etc / passwd para ser usado no login:

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) Dentro de "login.sh", executamos o script que queremos executar como "sudo":

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

Normalmente, ele solicitará a senha duas vezes: ssh login + sudo. Se você deseja inseri-lo apenas uma vez, tente sudo sem senha (não recomendado). <- leia o comentário de Boldewyn.

A principal vantagem é que "ssh" não requer nenhum outro parâmetro (como -t) e o sudo é forçado no lado do servidor. Além disso, uma vez que o script é encerrado, o usuário também é desconectado.

Pode não ser tão elegante, mas é simples e funciona.

lepe
fonte
Ah, oh. Colocar o usuário remoto no sudoersarquivo em um servidor como esse é uma catástrofe que está prestes a acontecer. Se alguém obtém acesso como seu usuário (por exemplo, através do servidor da Web), ele pode se tornar root imediatamente . Obrigado, mas eu estava procurando soluções que não colocam em risco a configuração do meu servidor. Se você tivesse uma solução, que de alguma forma reutilize magicamente a autenticação do SSH para o sudocomando, eu ficaria mais interessado (e talvez comece a procurar substituições para o SSH ...).
precisa saber é o seguinte
@Boldewyn: sim, definir "sudo sem senha" tem esse risco à segurança ... é uma etapa opcional. Concordo com você, se o SSH pudesse reutilizar a autenticação, esse tipo de "solução" não seria necessário. Obrigado por seu comentário.
Lepe
-1

Você pode executar o seguinte comando para obter acesso root sem interatividade:

ssh server " sudo command" < sudopassword.txt
SilentGuy
fonte
11
Isso não funcionará porque stdin não será um dispositivo de terminal (ele será lido no arquivo especificado).
Anthony G - Justice para Monica