Periksa secure_path di sudo
[[email protected] ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Jika $PATH
sedang diganti menggunakan visudo
dan edit /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Izin ditolak
Untuk menjalankan skrip, file harus memiliki set bit izin yang dapat dieksekusi .
Untuk memahami sepenuhnya izin file Linux, Anda dapat mempelajari dokumentasi untuk chmod
memerintah. chmod, singkatan dari ubah mode , adalah perintah yang digunakan untuk mengubah setelan izin suatu file.
Untuk membaca dokumentasi chmod untuk sistem lokal Anda, jalankan man chmod
atau info chmod
dari baris perintah. Setelah membaca dan memahami Anda harus dapat memahami hasil dari menjalankan ...
ls -l foo.sh
... yang akan mencantumkan izin BACA, TULIS, dan EKSEKUSI untuk pemilik file, pemilik grup, dan semua orang yang bukan pemilik file atau anggota grup tempat file tersebut berada (grup izin terakhir terkadang dirujuk ke sebagai "dunia" atau "lainnya")
Berikut ringkasan cara memecahkan masalah kesalahan Izin Ditolak dalam kasus Anda.
$ ls -l foo.sh # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh
^^^
^^^ | ^^^ ^^^^^^^ ^^^^^
| | | | |
Owner| World | |
| | Name of
Group | Group
Name of
Owner
Pemilik telah membaca dan menulis akses rw tetapi - menunjukkan bahwa izin yang dapat dieksekusi tidak ada
chmod
perintah memperbaikinya. (Grup dan lainnya hanya memiliki izin baca yang ditetapkan pada file, mereka tidak dapat menulis atau menjalankannya)
$ chmod +x foo.sh # The owner can set the executable permission on foo.sh
$ ls -l foo.sh # Now we see an x after the rw
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
^ ^ ^
foo.sh sekarang dapat dieksekusi sejauh menyangkut Linux.
Menggunakan hasil sudo di Command not found
Saat Anda menjalankan perintah menggunakan sudo Anda secara efektif menjalankannya sebagai superuser atau root.
Alasan mengapa pengguna root tidak menemukan perintah Anda kemungkinan adalah PATH
variabel lingkungan untuk root tidak menyertakan direktori tempat foo.sh
terletak . Oleh karena itu perintah tidak ditemukan.
Variabel lingkungan PATH berisi daftar direktori yang dicari untuk perintah. Setiap pengguna menetapkan variabel PATH mereka sendiri sesuai dengan kebutuhan mereka. Untuk melihat apa yang diatur untuk dijalankan
env | grep ^PATH
Berikut ini beberapa contoh hasil menjalankan env
di atas perintah pertama sebagai pengguna biasa dan kemudian sebagai pengguna root menggunakan sudo
[email protected]:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[email protected]:~$ sudo env | grep ^PATH
[sudo] password for rkielty:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Perhatikan bahwa, meskipun serupa, dalam hal ini direktori yang terdapat dalam PATH pengguna yang tidak memiliki hak istimewa (rkielty) dan pengguna super tidak sama .
Direktori tempat foo.sh
berada tidak ada dalam variabel PATH dari pengguna root, oleh karena itu perintah tidak ditemukan kesalahan.
Solusi lain yang saya lihat di sini sejauh ini didasarkan pada beberapa definisi sistem, tetapi sebenarnya dimungkinkan untuk memiliki sudo
gunakan PATH
saat ini (dengan env
perintah) dan/atau lingkungan lainnya (dengan -E
option) hanya dengan menjalankannya dengan benar:
sudo -E env "PATH=$PATH" <command> [arguments]
Faktanya, seseorang dapat membuat alias darinya:
alias mysudo='sudo -E env "PATH=$PATH"'
(Anda juga dapat menamai alias itu sendiri sudo
, menggantikan sudo
asli .)