web-dev-qa-db-fra.com

SSH: exécuter la commande Sudo

J'ai un script de shell interactif qui, à un endroit, doit ssh sur une autre machine (basée sur Ubuntu) et exécuter quelque chose en tant que root (l'utilisateur doit entrer son mot de passe, mais la commande à distance doit fonctionner comme indiqué dans le script):

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

Cependant, je reçois toujours ce message d'erreur:

Sudo: no tty present and no askpass program specified

OK, c'est assez clair. Mais comment puis-je contourner cela? Quelque chose comme ça devrait arriver:

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

/bin
/etc
/var
43
Boldewyn

Le merveilleux ssh a un traitement pour tout. Le point est d'ajouter l'indicateur -t pour forcer ssh à allouer un pseudo-tty:

ssh -t remote-server 'Sudo ls'
51
Boldewyn

Cette méthode exécutera un seul script en utilisant Sudo après ssh:

Supposons que nous ayons un utilisateur "distant" doté de capacités Sudo et que nous souhaitons exécuter un script en tant que root.

1) Définissez un script dans /etc/passwd à utiliser lors de la connexion:

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

2) Dans "login.sh", nous exécutons le script que nous voulons exécuter en tant que "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;

Normalement, le mot de passe sera demandé deux fois: ssh login + Sudo. Si vous souhaitez le saisir une seule fois, essayez Sudo sans mot de passe (non recommandé). <- veuillez lire le commentaire de Boldewyn.

Le principal avantage est que "ssh" ne nécessite aucun autre paramètre (comme -t), et que Sudo est forcé côté serveur. En outre, une fois le script terminé, l'utilisateur est également déconnecté.

Ce n'est peut-être pas si élégant, mais c'est simple et ça marche.

0
lepe