Bagaimana cara membuat `sudo` mempertahankan $ PATH?

123

Saya perlu menjalankan program yang diinstal pada / opt / godi / sbin (direktori khusus). Jika saya menambahkan direktori itu ke PATH saya, dengan menambahkan baris berikut ke file .bashrc saya

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

maka saya dapat mencoba menjalankan perintah dengan baik (kecuali bahwa itu gagal karena perlu sudo). Namun, ketika saya mencoba menggunakan sudo:

sudo godi_console

Saya mendapatkan kesalahan berikut

sudo: godi_console: command not found

Memeriksa variabel PATH setelah menggunakan sudo mengungkapkan bahwa itu tidak termasuk PATH yang sama dengan yang saya miliki sebagai pengguna normal:

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Mengapa PATH tidak sama? Apakah saya melakukan sesuatu yang salah? Saya menggunakan Debian Jessie dan sayangnya saya tidak bisa menyelesaikan masalah dengan mengirimkan sudo tautan absolut ke godi_console karena godi_console itu sendiri juga tergantung pada PATH yang diatur dengan benar.

hugomg
sumber
2
Coba sudo -E godi_console. -Eberarti "melestarikan lingkungan".
D_Bye
5
@D_Bye, itu tidak akan berfungsi jika secure_pathdan / atau env_reset dikonfigurasi seperti halnya di banyak sudopenyebaran seperti di Debian.
Stéphane Chazelas
@StephaneChazelas Terima kasih atas informasinya - Saya tidak menggunakan Debian, jadi mungkin saya harus tetap diam!
D_Bye
stackoverflow.com/questions/257616/sudo-changes-path-why
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Pertanyaan terkait, tentang sutidak sudo, adalah unix.stackexchange.com/questions/460478 .
JdeBP

Jawaban:

149

Anda selalu dapat melakukan:

sudo env "PATH=$PATH" godi_console

Sebagai tindakan keamanan pada Debian, /etc/sudoersmemiliki secure_pathpilihan set nilai yang aman.

Perhatikan bahwa:

sudo "PATH=$PATH" godi_console

Di mana sudomemperlakukan argumen utama yang berisi =karakter sebagai penugasan variabel lingkungan dengan sendirinya, juga akan berfungsi saat berjalan godi_consoledengan Anda $PATH (sebagai lawan dari secure_path) di lingkungannya, tetapi tidak akan memengaruhi sudojalur pencarian untuk dieksekusi, jadi tidak akan membantu sudomenemukan itu godi_console.

Stéphane Chazelas
sumber
5
Saya paling suka jawaban ini karena tidak perlu mengubah pengaturan secara global (mis.
Menjaga
5
sudo "PATH=$PATH" godi_console by the way tidak bekerja di CentOs7. Membutuhkan env
Hakan Baba
1
@ StéphaneChazelas Apakah sudo "PATH=$PATH" godi_consolepernah benar-benar berfungsi? sudomenerima VAR=valueargumen, memengaruhi lingkungan perintah yang dijalankannya, tetapi tidak seperti di envatau bash, sudosepertinya tidak membiarkan ini memengaruhi bagaimana ia melihat perintah. Saya hanya menguji ini (baru-baru ini) di Ubuntu 16.04. Tapi saya mencoba menambahkan exempt_groupopsi ke sudoers(hanya untuk pengujian - saya tidak menganggap ini solusi!) Dan hasilnya mencerahkan. Perintah-perintah dari formulir itu PATH="$PATH" sudo some-commandmulai berfungsi, tetapi perintah-perintah itu sudo PATH="$PATH" some-command masih belum berfungsi .
Eliah Kagan
2
@ballsatballsdotballs. Karena alias itu hanya akan memengaruhi shell interaktif Anda, itu seharusnya relatif tidak berbahaya.
Stéphane Chazelas
2
Saya baru saja membuat alias bernama psudo untuk jenis kasus ini, di mana: alias psudo = "sudo env \" PATH = $ PATH \ "". Maka penggunaan sudo normal saya tidak terpengaruh.
mikeTronix
46

Anda juga dapat mengatur PATH default di /etc/sudoers

edit file menggunakan visudo

dan perbarui baris sesuai keinginan Anda: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

michaelbn
sumber
18

SUDO melakukan env variabel reset secara default.

Lihatlah manual dan opsi yang disebut env_reset.

Anda hanya perlu menonaktifkannya di / etc / sudoers.

KWubbufetowicz
sumber
5
Keren! Di Ubuntu Anda dapat melihat dan mengomentari jalur secure_path dan env_reset. Membuat sistem jauh lebih tidak aman, jadi waspadalah.
RawwrBag
Menonaktifkan env_resettampaknya tidak memengaruhi sudoperilaku w / r / t PATH.
Zanna
5

Ini bekerja :

sudo $(which your_command)

Contoh memanggil gpsskrip saya yang mencantumkan proses Nvidia GPU:

$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
  PID TTY          TIME CMD
 9922 tty7     02:42:47 Xorg

Penjelasan:

$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
  PID TTY          TIME CMD
 9922 tty7     02:42:39 Xorg
+ set +x
SebMa
sumber
3
sudo --preserve-env=PATH env [command]

ovverrides ini secure_path di pihak saya

belum dibuka
sumber
1

Ini berhasil:

sudo "PATH=$PATH" [your command]

Jangan mengubah $ PATH dengan nilai jalur Anda, Anda cukup menuliskannya dengan cara ini

contoh: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....

imane kichu
sumber
0

Mungkin tidak persis apa yang diminta OP, tetapi ini mungkin membantu:

sudo -u the_user PATH=$PATH:/opt/godi/bin sh -c 'echo $PATH'

Ini mengubah PATH di dalam perintah sudoed.

Sunting: Saya tidak yakin apa yang saya maksudkan dengan ini, karena di atas cukup banyak omong kosong. Gunakan yang berikut ini sebagai gantinya:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
phil294
sumber