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.


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


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.


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


18

SUDO melakukan env variabel reset secara default.

Lihatlah manual dan opsi yang disebut env_reset.

Anda hanya perlu menonaktifkannya di / etc / sudoers.


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

3
sudo --preserve-env=PATH env [command]

ovverrides ini secure_path di pihak saya


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....


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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.