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.
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%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:
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%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.
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 ...
... 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:
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.
kann das vielleicht benutzen
Wie wird eine SUDO_ASKPASS-Umgebungsvariable eingerichtet?
Sie können die Umgebungsvariable SUDO_PROMPT im Prozessaufruf
setzenKombiniere 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.