Entschuldigung, Sie müssen ein TTY haben, um sudo auszuführen

Entschuldigung, Sie müssen ein TTY haben, um sudo auszuführen

Diese Frage hatte ich bereits gestellt inPaketüberfluss, aber ich wurde gebeten, es hier zu posten. Also mache ich dasselbe.

Ich habe diesen Befehl mit meinem Java-Programm ausgeführt.

sudo -u <username> -S pwd

Ich habe diese Ausgabe erhalten:

command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo

Ich habe versucht, /etc/sudoers zu bearbeiten, aber es enthält bereits

<username>       ALL=(ALL)       NOPASSWD: ALL

Dann erfuhr ich, dass dies durch Auskommentieren des folgenden Codes in /etc/sudoers erreicht werden kann

# Defaults requiretty

sudoAußerdem müssen wir standardmäßig unser eigenes Passwort angeben, wenn wir versuchen, einen Befehl als anderer Benutzer mit auszuführen . Dies kann jedoch geändert werden, indem Sie die folgende Änderung in /etc/sudoers vornehmen:

Defaults targetpw

Meine Frage ist,ist es möglich, meinen obigen Befehl in Java auszuführen, ohne irgendwo Änderungen vorzunehmen, d. h. mit Standardeinstellungen?

Antwort1

Ich weiß nicht, wie man Shell-Befehle in Java ausführt, aber sehen Sie sich die Option -t für den SSH-Befehl an

-t force pseudo-tty allocation.

Das mache ich, wenn ich einen Befehl als Root über SSH ausführen muss (direkte Root-Anmeldung deaktiviert und TTY durch Sudo erforderlich).

Antwort2

Meine Frage lautet: Ist es möglich, meinen obigen Befehl in Java auszuführen, ohne irgendwo Änderungen vorzunehmen, also mit den Standardeinstellungen?

sudo -u -S pwd

Die kurze Antwort lautet: Nein. Sie müssen die Einstellungen ändern, damit sudo die Dinge anders macht als derzeit.

sudo ist hierfür möglicherweise das falsche Tool. Die Regeln von Sudo sollen Systemadministratoren dabei helfen, eine Möglichkeit zu konfigurieren, erhöhte Berechtigungen zu erlangen, die nur schwer missbraucht werden kann, um zusätzliche/unbeabsichtigte Berechtigungen zu erlangen.

Wenn Sie bedenken, was sudo für Sie tut:

  1. fordert zur Bestätigung der Identität zur Eingabe eines Passworts auf
  2. Rechte erweitern
  3. dann optional Berechtigungen als anderer Benutzer erhalten
  4. Protokolliert die Verwendung von sudo, um Zugriff zu erhalten oder Befehle auszuführen

Wenn Sie möchten, dass Ihr Java beliebige Befehle als beliebige Benutzer ausführt, ohne das Passwort für diese Benutzer oder Ihr eigenes anzugeben, ersetzen Sie im Wesentlichen sudo. In diesem Fall sollten Sie Ihre eigenen Regeln erstellen, um Missbrauch zu verhindern.

Hierzu gibt es grundsätzlich zwei Möglichkeiten:

  1. Führen Sie Ihr Java mit erhöhten Berechtigungen aus und erteilen und vergeben Sie die benötigten Berechtigungen sorgfältig (siehe setuid() seteuid() C-Funktionsaufrufe).
  2. Führen Sie ein externes Programm aus, um bei Bedarf erweiterte Berechtigungen zu erhalten.

Im Fall Nr. 1 führt Ihr Java-Programm selbst das aus, was sudo tut, und Sie sollten Ihren eigenen Regelsatz implementieren, um es vor Missbrauch zu schützen.

Es gibt andere Programme als sudo, um #2 auszuführen. Ein Beispiel finden Sie inhttps://code.google.com/archive/p/exec-wrapper/downloads

Dieses praktische Shell-Skript erstellt ein C-Programm, um einen anderen Befehl (normalerweise ein Skript) auszuführen. Dann kompilieren Sie das C-Programm in eine Binärdatei und markieren diese als „setuid root“, oder es könnte tatsächlich für jeden Benutzer „setuid“ sein. (Modus: 4555 und Besitzer: root)

Sofern Sie sich auf einem Dateisystem befinden, das dies zulässt, wird beim Ausführen des Binärprogramms der konfigurierte Befehl mit der Benutzer-ID ausgeführt, der das Binärprogramm selbst gehört.

verwandte Informationen