SSH: exécuter la commande sudo

45

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 s'exécuter 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
Boldewyn
la source

Réponses:

52

Le merveilleux ssha un remède pour tout. Le point est d'ajouter l' -tindicateur pour forcer ssh à allouer un pseudo-tty:

ssh -t remote-server 'sudo ls'
Boldewyn
la source
1
Les PTY peuvent gâcher les choses avec les scripts, cependant. lsla sortie contiendra par exemple des terminaisons \ r \ n.
Tobu
1
Le moyen le plus simple consiste à forcer LS en mode non terminal. ls | catva faire - il va voir que stdout est un tuyau. Dans cette question spécifique, ce n'est pas pertinent, car il est apparemment destiné à être exécuté de manière interactive depuis un terminal - vous voulez donc probablement les colonnes et les couleurs, etc.
Gabe
0

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

Supposons que nous avons un utilisateur "distant" avec des 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é). <- s'il vous plaît lire le commentaire Boldewyn.

Le principal avantage est que "ssh" ne nécessite aucun autre paramètre (en tant que -t) et que sudo est forcé côté serveur. De plus, 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.

lepe
la source
Euh oh. Mettre votre utilisateur distant dans le sudoersfichier sur un serveur comme celui-ci est une catastrophe imminente. Si quelqu'un y accède en tant qu'utilisateur (par exemple via le serveur Web), il peut immédiatement devenir root. Merci, mais je cherchais des solutions qui ne placent pas ma configuration de serveur en contradiction. Si vous aviez une solution qui réutilise magiquement l'authentification de SSH pour la sudocommande, je serais plus intéressé (et commencerais peut-être à chercher des remplaçants pour SSH ...).
Boldewyn
@Boldewyn: oui, la définition de "sudo sans mot de passe" comporte un risque de sécurité ... c'est une étape facultative. Je suis d'accord avec vous, si SSH pouvait réutiliser l'authentification, ce type de "solutions" ne serait pas nécessaire. Merci pour votre commentaire.
lepe
-1

Vous pouvez exécuter la commande suivante pour obtenir un accès root sans interactivité:

ssh server " sudo command" < sudopassword.txt
SilentGuy
la source
1
Cela ne fonctionnera pas car stdin ne sera pas un terminal (il lira à partir du fichier spécifié).
Anthony G - justice pour Monica