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
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'
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.