Mengapa menjalankan perintah karena sudo mengembalikan perintah yang tidak ditemukan?

12

Perintah sampel:

drush cc all

bekerja, tetapi ini:

sudo drush cc all

memberi saya:

sudo: drush: command not found

Mengapa? Bagaimana cara memperbaikinya?

Natrium
sumber
Saya juga terkadang mengalami masalah ini, dengan perintah dasar seperti cd. Menggunakan dzdo cdkembali "perintah tidak ditemukan". Tentu saja saya kemudian menyadari bahwa cding ke direktori yang saya tidak memiliki izin di, tidak akan membantu banyak, jadi saya juga perlu shell root atau perlu dzdo ls, dzdo mv, dll isi dari luar yang dir.
Wildcard
2
Masalahnya sudo cdadalah itu cdadalah perintah bawaan, bukan program. Jika Anda ingin masuk ke direktori yang Anda tidak memiliki akses, dan (misalnya) mengganti nama file di sana, Anda dapat melakukan (misalnya) sudo mv dir/oldfile dir/newfile atau sudo sh -c "cd dir; mv oldfile newfile" .
G-Man Mengatakan 'Reinstate Monica'

Jawaban:

13

Saat Anda sudo, Anda mendapatkan prakonfigurasi $PATH, yang (seharusnya) seperti path default pengguna root . Program Anda tidak ada dalam daftar direktori yang diidentifikasi oleh $PATH.

Lihat misalnya

sudo mencoba aman ketika menjalankan perintah eksternal.

Ada dua cara berbeda untuk menangani variabel lingkungan. Secara default, opsi env_reset sudoers diaktifkan. Penyebab perintah ini akan dieksekusi dengan lingkungan minimal mengandung TERM, PATH, HOME, SHELL, LOGNAME, USERdan USERNAMEselain variabel dari proses memohon diizinkan oleh env_checkdan env_keep sudoers pilihan. Ada secara efektif daftar putih untuk variabel lingkungan.

Jika Anda tidak dapat mengonfigurasi sudountuk melestarikan Anda $PATH, solusinya yang biasa adalah menentukan pathname lengkap program. Itu mungkin tidak bekerja dengan baik dengan skrip yang memanggil executable lain di direktori (tidak diakses).

Thomas Dickey
sumber
0

Anda harus menentukan path lengkap. Ini juga lebih aman; Jika Anda tidak menentukan jalurnya, mungkin penyerang dapat membuat program lain yang akan dijalankan dengan izin root.

Juga, Anda perlu memasukkan garis /etc/sudoersuntuk mengizinkannya. man sudoersuntuk sintaks, terlalu banyak untuk dimasukkan di sini.

Tom Zych
sumber