Heim  >  Artikel  >  Java  >  Warum schlagen Unix-Befehle mit der Fehlermeldung „Nicht gefunden' fehl, wenn sie über JSch in Java ausgeführt werden?

Warum schlagen Unix-Befehle mit der Fehlermeldung „Nicht gefunden' fehl, wenn sie über JSch in Java ausgeführt werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-12 00:33:02981Durchsuche

Why do Unix commands fail with

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:

  • Bestimmte Unix-Befehle schlagen mit „... nicht gefunden“ fehl. , wenn sie über Java mit JSch ausgeführt werden, auch wenn setPty aktiviert ist
  • Befehle, die mit JSch ausgeführt werden, verhalten sich anders als im SSH-Terminal (umgeht die Bestätigungsaufforderungsmeldung „Ja/“Nein“)
  • JSch: Gibt es Eine Möglichkeit, Benutzerumgebungsvariablen dem „exec“-Kanal zugänglich zu machen?
  • Befehl (.4gl), der mit SSH.NET SshClient.RunCommand ausgeführt wird, schlägt mit „Keine solche Datei oder Verzeichnis“ fehl

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn