Unix-Befehle können nicht ausgeführt werden mit dem Fehler „Nicht gefunden“ über JSch
Beim Versuch, bestimmte Unix-Befehle über die JSch-Bibliothek in Java auszuführen, Benutzer erhalten möglicherweise Fehlermeldungen, die besagen, dass der Befehl nicht gefunden werden konnte.
Verstehen des Problems
Im Gegensatz zu einem interaktiven SSH-Client weist der „exec“-Kanal von JSch kein Pseudo zu Terminal (PTY) standardmäßig verwendet. Dieser Unterschied in der Umgebung kann im Vergleich zu interaktiven Sitzungen zu unterschiedlichen Startskriptausführungen und PATH-Setups führen. Folglich können Befehle, die auf bestimmten Umgebungsvariablen basieren, fehlschlagen.
Identifizieren der Grundursache
Um die Grundursache zu bestätigen, deaktivieren Sie die PTY-Zuweisung in Ihrem SSH-Client und versuchen Sie es Führen Sie den Befehl manuell aus. Wenn derselbe Fehler „nicht gefunden“ auftritt, deutet dies darauf hin, dass die Umgebungsvariable PATH zwischen interaktiven und nicht interaktiven Sitzungen unterschiedlich ist.
Lösungen
Um dieses Problem zu beheben Betrachten Sie die folgenden Lösungen in der Reihenfolge ihrer Präferenz:
1. Ändern Sie den Befehl, um den Pfad zur ausführbaren Datei explizit zu definieren
String command = "/bin/air sandbox run <graph-path>";
2. Passen Sie Startskripte an, um den PATH konsistent festzulegen.
Stellen Sie sicher, dass der PATH für interaktive und nicht interaktive Sitzungen in den Startskripten auf dem Remote-Server identisch eingestellt ist.
3. Verwenden Sie die Login-Shell, um den Befehl auszuführen
Stellen Sie dem Befehl „bash --login -c“ voran, um ihn explizit über die Login-Shell auszuführen, die normalerweise eine konsistente Umgebung festlegt:
String command = "bash --login -c \"air sandbox run <graph-path>\"";
4. Legen Sie die Umgebungsvariablen direkt im Befehl fest
Bei Befehlen, die stark von der Einrichtung einer bestimmten Umgebung abhängen, sollten Sie die Variablen direkt im Befehl festlegen:
String command = "PATH=\"$PATH;/path/to/air\" && air sandbox run <graph-path>";
5. Erzwungene PTY-Zuweisung (nicht empfohlen)
Als letzten Ausweg können Sie die PTY-Zuweisung für den „exec“-Kanal mit .setPty(true) erzwingen. Dieser Ansatz kann jedoch zu unerwünschten Nebenwirkungen führen.
Weitere Erkenntnisse und ähnliche Probleme finden Sie in den folgenden Ressourcen:
Das obige ist der detaillierte Inhalt vonWarum schlagen Unix-Befehle mit der Fehlermeldung „Nicht gefunden“ fehl, wenn sie über JSch in Java ausgeführt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!