Rumah  >  Artikel  >  Java  >  Mengapa arahan Unix gagal dengan ralat 'Tidak Ditemui' semasa melaksanakannya melalui JSch di Jawa?

Mengapa arahan Unix gagal dengan ralat 'Tidak Ditemui' semasa melaksanakannya melalui JSch di Jawa?

Patricia Arquette
Patricia Arquetteasal
2024-11-12 00:33:02981semak imbas

Why do Unix commands fail with

Arahan Unix Gagal Melaksanakan dengan Ralat "Tidak Ditemui" melalui JSch

Apabila cuba melaksanakan arahan Unix tertentu melalui perpustakaan JSch di Java, pengguna mungkin menghadapi ralat yang menyatakan bahawa arahan itu tidak boleh dijumpai.

Memahami Masalah

Tidak seperti klien SSH interaktif, saluran "exec" JSch tidak memperuntukkan terminal pseudo (PTY) secara lalai. Perbezaan dalam persekitaran ini boleh membawa kepada pelaksanaan skrip permulaan yang berbeza-beza dan persediaan PATH berbanding sesi interaktif. Akibatnya, arahan yang bergantung pada pembolehubah persekitaran tertentu mungkin gagal.

Mengenalpasti Punca Punca

Untuk mengesahkan punca, lumpuhkan peruntukan PTY dalam klien SSH anda dan cuba untuk laksanakan arahan secara manual. Jika anda menghadapi ralat "tidak ditemui" yang sama, ini menunjukkan bahawa pembolehubah persekitaran PATH berbeza antara sesi interaktif dan tidak interaktif.

Penyelesaian

Untuk menangani isu ini , pertimbangkan penyelesaian berikut mengikut keutamaan:

1. Ubah suai Perintah untuk Menentukan Laluan ke Boleh Laksana dengan Eksplisit

String command = "/bin/air sandbox run <graph-path>";

2. Laraskan Skrip Permulaan untuk Menetapkan PATH Secara Konsisten

Pastikan PATH ditetapkan secara sama untuk kedua-dua sesi interaktif dan tidak interaktif dalam skrip permulaan pada pelayan jauh.

3. Gunakan Shell Log Masuk untuk Menjalankan Perintah

Sediakan arahan dengan "bash --login -c" untuk menjalankannya secara eksplisit melalui shell log masuk, yang biasanya menetapkan persekitaran yang konsisten:

String command = "bash --login -c \"air sandbox run <graph-path>\"";

4. Tetapkan Pembolehubah Persekitaran Secara Terus dalam Perintah

Untuk arahan yang sangat bergantung pada persediaan persekitaran tertentu, pertimbangkan untuk menetapkan pembolehubah terus dalam arahan:

String command = "PATH=\"$PATH;/path/to/air\" && air sandbox run <graph-path>";

5. Peruntukan PTY Paksa (Tidak Disyorkan)

Sebagai langkah terakhir, anda boleh memaksa peruntukan PTY untuk saluran "exec" menggunakan .setPty(true). Walau bagaimanapun, pendekatan ini boleh memperkenalkan kesan sampingan yang tidak diingini.

Untuk mendapatkan cerapan tambahan dan isu serupa, rujuk sumber berikut:

  • Arahan Unix tertentu gagal dengan "... tidak dijumpai" , apabila dilaksanakan melalui Java menggunakan JSch walaupun dengan setPty didayakan
  • Perintah yang dilaksanakan menggunakan JSch berkelakuan berbeza daripada dalam Terminal SSH (memintas mengesahkan mesej gesaan "ya/"tidak")
  • JSch: Adakah terdapat cara untuk mendedahkan pembolehubah persekitaran pengguna kepada saluran "exec"?
  • Arahan (.4gl) dilaksanakan dengan SSH.NET SshClient.RunCommand gagal dengan "Tiada fail atau direktori sedemikian"

Atas ialah kandungan terperinci Mengapa arahan Unix gagal dengan ralat 'Tidak Ditemui' semasa melaksanakannya melalui JSch di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn