it-swarm.com.de

umgebungsvariable SSH_ASKPASS bzw. askpass in Sudoers setzen

Ich versuche mich an einem SSH-Server anzumelden und so etwas auszuführen:

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

Leider bekomme ich eine Fehlermeldung:

Sudo: no tty present and no askpass program specified

Google hat mir empfohlen, entweder die Umgebungsvariable SSH_ASKPASS oder askpass in der sudoers-Datei festzulegen. Mein Remote-Computer läuft unter Debian 6 und ich habe die Pakete ssh-askpass und ssh-askpass-gnome installiert. Meine sudoers-Datei sieht folgendermaßen aus:

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

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

Kann jemand sagen, was ich falsch mache und wie es besser geht.

17
jan

Es gibt zwei Möglichkeiten, diese Fehlermeldung zu löschen. Der einfachste Weg ist, ein Pseudo-Terminal für den Remote-Sudo-Prozess bereitzustellen. Dies können Sie mit der Option -t tun:

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

Anstatt ein TTY zuzuweisen oder ein Kennwort festzulegen, das in der Befehlszeile angezeigt wird, gehen Sie folgendermaßen vor.

Erstellen Sie eine Shell-Datei, die Ihr Passwort wie folgt anzeigt:

#!/bin/bash

echo "mypassword"

kopieren Sie diese dann mit scp auf den gewünschten Knoten:

scp SudoPass.sh somesystem:~/bin

Wenn Sie dann ssh sind, gehen Sie wie folgt vor:

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

Eine andere Möglichkeit ist, Sudo -S auszuführen, um "die Eingabeaufforderung in den Standardfehler zu schreiben und das Kennwort aus der Standardeingabe zu lesen, anstatt das Endgerät zu verwenden" (gemäß man) zusammen mit cat:

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

Geben Sie einfach das Passwort ein, wenn Sie dazu aufgefordert werden.

Ein Vorteil ist, dass Sie die Ausgabe des Remote-Befehls ohne "[Sudo] -Passwort für ..." in eine Datei umleiten können:

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

EDIT Dezember 2013: Hier ist eine kürzere Antwort: Nehmen Sie sich ein oder zwei Tage Zeit, um sich mit der Python-Bibliothek " Fabric " vertraut zu machen. Fabric löst eine Vielzahl von Problemen hinsichtlich der Verteilung von Remote-Aufgaben an einen oder mehrere Server. 

Wahrscheinlich möchten Sie noch einen Benutzernamen auf dem Zielsystem einrichten, der kennwortlose Befehle ausführen kann (und Sie können dies auch mit Fabric tun!).

Beachten Sie, dass einige Aspekte von Fabric nicht perfekt Pythonic sind. Außerdem wurde Fabric zuerst mit Blick auf Sysadmins entwickelt, also Personen, die Befehle gegen Server stapeln möchten. Wenn Sie versuchen, etwas anderes zu tun (z. B. einige sehr spezielle Server oder Szenarien automatisieren), sollten Sie wissen, wie "mit Einstellungen" und/oder der @roles-Dekorator funktioniert. Ich habe nicht zurückgeschaut ...

(Ja, ich habe Remote-SSH-Befehle, die auf "entfernten" Systemen arbeiten.) Server A fordert Server B auf, eine Verbindung zu Server C herzustellen, und die Rückgabe des Befehls wird auf Server A angezeigt, auch wenn A nicht direkt mit A spricht Server C. Erleichtert die Einrichtung des Labors!).

Ursprüngliche Antwort: Für dieses Problem gibt es VIELE Lösungen. Pferde für Kurse; Einige sind in verschiedenen Situationen besser als andere.

Die Frage ist, wie der Fehler "no TTY" behoben werden kann. Das scheint der Fokus zu sein, also gehe ich davon aus, dass das Gespräch über Sudoers nur ein Versuch ist, das Problem zu umgehen, um das TTY-Problem zu vermeiden.

Option 1) Askhats Antwort funktioniert großartig ... meistens. Geben Sie eigentlich immer "-tt" an, das auf mehreren Zielsystemen funktioniert.

Beachten Sie, dass das Problem weiterhin auftritt, wenn Sie eine SSH-Bibliothek wie Paramiko verwenden, die "-t" nicht intuitiv ausführen kann. 

Option 2) Meine Antwort - ist die Angabe eines ASKPASS, der STDIN ist. Dieses Beispiel erfüllt also sowohl die Sudo-Kennwortanforderung als auch das TTY: $ Shell> ssh [email protected] 'Echo "Kennwort" | Sudo-Echo "foobar"'

Option 3) Ja, Sie können die Sudo-Kennwortüberprüfung für alle oder einige Benutzer deaktivieren. Dies ist jedoch auf einem Produktionsserver nicht besonders interessant. 

Option 4) Sie können "requiretty" (oder "! Requiretty") für alle oder einige Benutzer in sudoers "remote" einstellen.

Serveränderungen sollten möglichst vermieden werden. Irgendwann wird dieser Server ersetzt, die Einstellungen werden auf die Standardeinstellungen zurückgesetzt und Ihr Skript funktioniert nicht mehr. 

Wenn Sie alle Ihre Optionen verstanden haben, öffnet sich die Tür für viel mehr Automatisierung (z. B. ein Skript auf Ihrem Laptop als eine Verbindung zu einer Liste von Server-Hostnamen) und Sie können Sudo-Tasks auf diesen Servern ausführen, ohne die besagten Server kopieren zu müssen Skripts auf diesen Servern).

1

Defaults askpass=/usr/bin/ssh-askpass

ssh-askpass erfordert einen X-Server. Anstelle eines Terminals (über -t, wie von nosid vorgeschlagen), können Sie die X-Verbindung über -X weiterleiten:

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

Gemäß der aktuellen Dokumentation wird jedoch askpass in Sudo.conf als Path festgelegt, nicht in sudoers.

0
Jan Hudec