So führen Sie den Befehl sudo für OS X in Java aus

8

Ich arbeite an der App in javafx, ich versuche eine Anwendung mit einem Befehl im Terminal zu öffnen, ich benutze den Befehl mit meinem Java-Code mein Befehl habe eine Variable, es ist Pfad meiner Installer-Datei, die nicht immer gleich sein wird da der Dateiname unterschiedlich sein kann, wenn die Builds aktualisiert werden.
Hier ist ein Beispiel, wie ich den Befehl ausführe, es ist nicht der genaue Befehl, den ich ausführe, aber das Befehlsformat ist gleich.

%Vor%

Der Prozess gibt keine Ausgabe, er stoppt dort und nichts passiert. Derselbe Befehl habe ich vom Terminal aus versucht und es funktioniert gut.

Ich habe versucht, die Dinge in diesem Link erwähnen

Wie führe ich einen Bash-Befehl mit Sudoprivilegien in Java?

aber es hat auch nicht funktioniert.

Ich führe auch Befehl wie "chmod + x" aus meinem Java-Code diese Befehle läuft gut. Mein ursprünglicher Befehl sieht so aus: -

%Vor%

Dabei ist a.getAbsolutePath () der Pfad der Installationsdatei und b.getAbsolutePath () ist der Pfad der Installationsdatei, die wir zur Installation der Anwendung verwendet haben.

%Vor%

gibt den Befehl aus, und wenn ich ihn kopiere und einfüge, handelt es sich um ein Terminal, das läuft.

%Vor%

gibt nichts.

Ich habe versucht,

auszuführen %Vor%

und

%Vor%

auch hier habe ich folgenden Fehler bekommen

%Vor%     
user3649361 23.05.2016, 10:12
quelle

5 Antworten

10

sudo

Ich würde dringend empfehlen, die sudoers-Datei zu bearbeiten und dem Benutzer, der die Anwendung ausführt, zu erlauben, die spezifischen Befehle über sudo zu verwenden, ohne nach einem Passwort zu fragen, anstatt eine echo passwd | sudo ... -Konstruktion zu machen.

Auf diese Weise vermeiden Sie das Speichern von Kennwörtern in einer Anwendungs- oder Konfigurationsdatei (und bestenfalls leicht verschleiert), und Sie vermeiden die Notwendigkeit, eine Shell mit einem Shell-Skript aufzurufen, das sudo usw. aufruft.

Sudoers können über den Befehl visudo bearbeitet werden. Sehen Sie hier als Beispiel, wie es auf unbuntu gemacht wird, aber es ist das gleiche auf jedem Unix. Ссылка

Zusätzlicher Hinweis: Ссылка

Ich denke, du stellst die falsche Frage ...

Autorisierung auf einem Mac

Auf einem Mac sollten Anwendungen, die Operationen ausführen müssen, die zusätzliche Rechte erfordern, nicht mit sudo beginnen.

Eine App sollte stattdessen die Autorisierungsdienste verwenden.

Referenzen:

swa66 27.05.2016 20:07
quelle
4

Ich würde NICHT empfehlen, dies zu tun - schrei mich nicht an, wenn du etwas kaputt machst :)

Aber was du verlangst, kann erreicht werden mit:

%Vor%     
Maciej Cygan 27.05.2016 21:39
quelle
3

Ich denke, dass Sie den vollständigen Pfad zu der Anwendung verwenden müssen. Dies sollte funktionieren:

%Vor%

Aktualisieren :

Basierend auf Ihrem Kommentar könnten Sie versuchen, den Prozess zu teilen. Die Chancen stehen gut, dass open eine interaktive Sitzung benötigt.

Erstellen Sie ein Skript (z. B. openSafari.sh), das Safari als Benutzer öffnet.

%Vor%

Machen Sie es ausführbar: chmod +x openSafari.sh , und rufen Sie dieses Skript von Java.

%Vor%     
cb0 23.05.2016 11:25
quelle
3

Die Runtime.exec() -Methoden führen den angegebenen Befehl direkt aus, nicht über eine Shell. Die spezielle Überladung, die Sie verwenden, markiert den Befehl in Leerzeichen und interpretiert die resultierenden Token als Namen des Befehls und der Argumente. Der einzige Befehl, der von Ihrem Aufruf ausgeführt wird ...

%Vor%

... ist daher echo ; alles andere ist ein Argument. Das Ergebnis ist die folgende Ausgabe an die Standardausgabe des Prozesses:

  

Passwort | Sudo -S öffnen-eine Safari

Es gibt mindestens ein paar Möglichkeiten, um das zu erreichen, was Sie zu haben scheinen. Die einfachste Änderung Ihres ursprünglichen Codes wäre wahrscheinlich

%Vor%

Damit wird erreicht, was Sie dachten, indem Sie explizit eine Shell aufrufen, um den Befehl auszuführen.

Aber das ist ein erhebliches Sicherheitsrisiko , da das Passwort in der Prozessliste als Klartext angezeigt wird. Sie können stattdessen Ihr Java-Programm das Passwort direkt einspeisen lassen und dann auch vermeiden, dass bash beteiligt ist:

%Vor%

Andere Überlegungen:

  • Es ist ratsam, wie bereits gezeigt, dem Befehl sudo den vollständigen Pfad zu geben, um zu vermeiden, dass ein anderer sudo , der zufällig im Pfad gefunden wird, ausgeführt wird. Da Sie einem privilegierten Konto das Passwort geben, ist es wichtig, die Möglichkeit zu minimieren, ein Rogue-Programm auszuführen.

  • Es wäre auch ratsam, keine Passwörter im Programm oder in einer Konfigurationsdatei zu speichern. Daher sollten Lösungen, bei denen ein Kennwort an sudo übergeben wird, auch die interaktive Eingabe des Kennworts von einem Benutzer umfassen.

  • Sicherheitsbewusste Java-Programme bevorzugen häufig die Speicherung von Passwörtern in char arrays statt in String s, so dass sie proaktiv gelöscht werden können, wenn sie nicht mehr benötigt werden. String s kann nicht geändert werden und sie können sich unbegrenzt in der VM befinden (noch mehr als viele andere Objekte).

  • Im Allgemeinen müssen Sie die Eingabe- und Fehlerströme von Process gleichzeitig löschen, unabhängig davon, ob Sie etwas mit dem Inhalt machen oder nicht. Wenn Sie dies nicht tun, blockiert der externe Prozess möglicherweise und / oder kann nicht beendet werden. Das ist jedoch wahrscheinlich kein Problem mit safari , da ich glaube, dass es normalerweise keine Ausgabe in diesen Streams erzeugt.

John Bollinger 01.06.2016 16:06
quelle
0

kann das vielleicht benutzen

Wie wird eine SUDO_ASKPASS-Umgebungsvariable eingerichtet?

Sie können die Umgebungsvariable SUDO_PROMPT im Prozessaufruf

setzen

Kombiniere das mit dem Fix, wie du jon bollinger, maciej, etc. benutzt hast.

Dann rufen Sie eine Passwortabfrage für Ihren Benutzer auf oder greifen Sie auf einen PKI mit Ihren Zugangsdaten zu. (für die Liebe Gottes zumindest verschlüsseln sie es, wenn Sie für die PKI gehen)

wie Sie gesagt haben, dass dies auf anderen Maschinen laufen soll, wird es im Grunde eine beschissene uac-Eingabeaufforderung sein und das klingt nicht wie eine sehr Mac / Linux-Lösung. swa66 ist der beste Weg, aber das wird schnell und schmutzig.

    
squishy 01.06.2016 21:15
quelle

Tags und Links