web-dev-qa-db-fra.com

définissez la variable d'environnement SSH_ASKPASS ou askpass dans les sudoers, respectivement

J'essaie de me connecter à un serveur ssh et d'exécuter quelque chose comme:

ssh [email protected] 'Sudo echo "foobar"'

Malheureusement, je reçois une erreur:

Sudo: no tty present and no askpass program specified

Google m'a dit de définir la variable d'environnement SSH_ASKPASS ou de définir askpass dans le fichier sudoers. Ma machine distante fonctionne sous Debian 6 et j'ai installé les paquets ssh-askpass et ssh-askpass-gnome et mon fichier sudoers ressemble à ceci:

Defaults        env_reset
Defaults        askpass=/usr/bin/ssh-askpass

# User privilege specification
root    ALL=(ALL) ALL
user    ALL=(ALL) ALL

Est-ce que quelqu'un peut dire ce que je fais mal et comment mieux le faire?.

17
jan

Il existe deux manières de supprimer ce message d'erreur. Le moyen le plus simple est de fournir un pseudo-terminal pour le processus Sudo distant. Vous pouvez le faire avec l'option -t:

ssh -t [email protected] 'Sudo echo "foobar"'
18
nosid

Plutôt que d’allouer un téléscripteur ou de définir un mot de passe visible en ligne de commande, procédez comme suit.

Créez un fichier Shell contenant votre mot de passe, comme ceci:

#!/bin/bash

echo "mypassword"

puis copiez-le sur le noeud que vous voulez en utilisant scp comme ceci:

scp SudoPass.sh somesystem:~/bin

Ensuite, lorsque vous ssh, procédez comme suit:

ssh somesystem "export Sudo_ASKPASS=~/bin/SudoPass.sh;Sudo -A command -parameter"
5
Michael

Une autre méthode consiste à exécuter Sudo -S afin "d’écrire l’invite sur l’erreur standard et de lire le mot de passe à partir de l’entrée standard au lieu d’utiliser le terminal" (selon man) avec cat:

cat | ssh [email protected] 'Sudo -S echo "foobar"'

Entrez simplement le mot de passe lorsque vous y êtes invité.

Un avantage est que vous pouvez rediriger la sortie de la commande distante vers un fichier sans "mot de passe [Sudo] pour ...":

cat | ssh [email protected] 'Sudo -S tar c --one-file-system /' > backup.tar
2
simon04

EDIT Dec 2013: Voici une réponse plus courte: Prenez un jour ou deux pour vous familiariser avec la bibliothèque Python " Fabric ". Fabric résout une tonne de problèmes liés à la répartition des tâches distantes sur un ou plusieurs serveurs. 

Vous voudrez probablement toujours configurer un nom d'utilisateur sur le système cible qui peut exécuter des commandes sans mot de passe (et vous pouvez également utiliser Fabric pour le faire!).

Méfiez-vous simplement que certains aspects de Fabric ne sont pas parfaitement Pythonic. En outre, Fabric a été conçu en premier lieu pour les administrateurs système, à savoir les personnes qui souhaitent regrouper des commandes par lot contre des serveurs. Si vous essayez de faire autre chose (comme automatiser des serveurs ou des scénarios très spécifiques), vous voudrez bien comprendre comment fonctionne "avec les paramètres" et/ou le décorateur @roles. Je n'ai pas regardé en arrière ...

(Et oui, des commandes SSH distantes fonctionnent sur des systèmes "distants". Autrement dit, le serveur A demande au serveur B de se connecter au serveur C, et le retour de la commande est visible sur le serveur A même si A ne parle pas directement à serveur C. Facilite l’installation du laboratoire!).

Réponse originale: Il existe de nombreuses solutions à ce problème. Chevaux de course; certains sont meilleurs que d'autres dans des situations différentes.

La question posée est de savoir comment résoudre l'erreur "no TTY". Cela semble être le centre d'intérêt, donc je suppose que les discussions sur les sudoers ne sont qu'une tentative de contournement pour éviter le problème du téléscripteur.

Option 1) La réponse de Askhat fonctionne très bien ... la plupart du temps. En fait, spécifiez toujours "-tt" qui fonctionne sur plusieurs systèmes cibles.

Notez que vous rencontrerez toujours le problème si vous utilisez une bibliothèque SSH telle que Paramiko, qui n’a pas de manière intuitive de faire "-t". 

Option 2) Ma réponse est de spécifier un ASKPASS qui est STDIN. Donc, cet exemple satisfait à la fois à l'exigence de mot de passe Sudo et à l'ATS: $ Shell> ssh [email protected] 'echo "mot de passe" | Sudo -S echo "foobar"'

Option 3) Oui, vous pouvez désactiver les contrôles de mot de passe Sudo sur tout ou partie des utilisateurs, mais ce n'est pas cool sur un serveur de production. 

Option 4) Vous pouvez utiliser "requiretty" à distance (ou définir "! Requiretty" pour tout ou partie des utilisateurs de sudoers. Encore une fois, pas cool sur une boîte de production.

Il est préférable d'éviter de modifier le serveur. Un jour, ce serveur sera remplacé, les paramètres reviendront aux paramètres par défaut et votre script cessera de fonctionner. 

Notez qu’une fois que vous avez compris toutes vos options, cela ouvre la porte à beaucoup plus d’automatisation (par exemple, un script sur votre ordinateur portable qui peut se connecter à une liste de noms d’hôte de serveur et effectuer des tâches Sudo sur ces serveurs sans que vous ayez besoin de les copier scripts sur ces serveurs).

1
Crossfit_and_Beer

Defaults askpass=/usr/bin/ssh-askpass

ssh-askpass requiert le serveur X. Au lieu de fournir un terminal (via -t, comme suggéré par nosid), vous pouvez transférer la connexion X via -X:

ssh -X [email protected] 'Sudo echo "foobar"'

Toutefois, selon la documentation actuelle, askpass est défini dans Sudo.conf sous la forme Path et non dans sudoers.

0
Jan Hudec