Làm thế nào để thực hiện `sudo` bảo tồn $ ​​PATH?


123

Tôi cần chạy một chương trình được cài đặt trên / opt / godi / sbin (một thư mục tùy chỉnh). Nếu tôi thêm thư mục đó vào PATH của mình, bằng cách thêm dòng sau vào tệp .bashrc của tôi

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

sau đó tôi có thể cố gắng chạy lệnh tốt (ngoại trừ việc nó bị lỗi vì nó cần sudo). Tuy nhiên, khi tôi cố gắng sử dụng sudo:

sudo godi_console

Tôi nhận được lỗi sau đây

sudo: godi_console: command not found

Kiểm tra biến PATH sau khi sử dụng sudo cho thấy rằng nó không bao gồm cùng một PATH mà tôi có như một người dùng bình thường:

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

Tại sao PATH không giống nhau? Tôi có làm điều gì sai? Tôi đang sử dụng Debian Jessie và thật không may, tôi không thể khắc phục được vấn đề bằng cách chuyển sudo liên kết tuyệt đối đến godi_console vì chính godi_console cũng phụ thuộc vào PATH được đặt chính xác.


2
Hãy thử sudo -E godi_console. -Ecó nghĩa là "giữ gìn môi trường".
D_Bye

5
@D_Bye, điều đó sẽ không hoạt động nếu secure_pathvà / hoặc env_reset được định cấu hình như trường hợp trong nhiều sudotriển khai như trên Debian.
Stéphane Chazelas

@StephaneChazelas Cảm ơn thông tin - Tôi không sử dụng Debian, vì vậy có lẽ tôi nên giữ im lặng!
D_Bye


Một câu hỏi liên quan, về sukhông sudo, là unix.stackexchange.com/questions/460478 .
JdeBP

Câu trả lời:


149

Bạn luôn có thể làm:

sudo env "PATH=$PATH" godi_console

Là một biện pháp bảo mật trên Debian, /etc/sudoerssecure_pathtùy chọn được đặt thành giá trị an toàn.

Lưu ý rằng:

sudo "PATH=$PATH" godi_console

Trong trường hợp sudoxử lý đối số chứa hàng đầu =ký tự như bài tập biến môi trường bằng cách riêng của mình, cũng sẽ làm việc tại chạy godi_consolevới bạn $PATH (như trái ngược với secure_path) trong môi trường của nó, nhưng sẽ không ảnh hưởng đến sudo's đường dẫn tìm kiếm cho thực thi, như vậy sẽ không giúp đỡ sudotrong việc tìm kiếm đó godi_console.


5
Tôi thích câu trả lời này tốt nhất vì nó tránh được cần phải thay đổi các thiết lập trên toàn cầu (tức là bảo tồn nguyên tắc đặc quyền tối thiểu)
Alois Mahdal

5
sudo "PATH=$PATH" godi_console Nhân tiện, không hoạt động trong CentOs7. Cần env
Hakan Baba

1
@ StéphaneChazelas Có sudo "PATH=$PATH" godi_consolebao giờ thực sự làm việc? sudochấp nhận các VAR=valueđối số, ảnh hưởng đến môi trường của lệnh mà nó chạy, nhưng không giống như trong envhoặc bash, sudodường như không để điều này ảnh hưởng đến cách tìm kiếm lệnh. Tôi chỉ thử nghiệm điều này (gần đây) trên Ubuntu 16.04. Nhưng tôi đã thử thêm exempt_grouptùy chọn vào sudoers(chỉ để thử nghiệm - tôi không coi đây là một giải pháp!) Và kết quả thật sáng sủa. Các lệnh của biểu mẫu PATH="$PATH" sudo some-commandbắt đầu hoạt động, nhưng các lệnh của biểu mẫu sudo PATH="$PATH" some-command vẫn không hoạt động.
Eliah Kagan

2
@ballsatballsdotballs. Vì bí danh đó chỉ ảnh hưởng đến các vỏ tương tác của bạn, nên điều đó tương đối vô hại.
Stéphane Chazelas

2
Tôi chỉ tạo một bí danh gọi là psudo cho các loại trường hợp này, trong đó: alias psudo = "sudo env \" PATH = $ PATH \ "". Sau đó, sử dụng sudo bình thường của tôi không bị ảnh hưởng.
mikeTronix

46

Bạn cũng có thể đặt PATH mặc định tại /etc/sudoers

chỉnh sửa tập tin bằng cách sử dụng visudo

và cập nhật dòng đến những gì bạn muốn: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin


18

SUDO đang thực hiện thiết lập lại các biến env theo mặc định.

Kiểm tra hướng dẫn và tùy chọn của nó được gọi là env_reset.

Bạn chỉ cần vô hiệu hóa nó trong / etc / sudoers.


5
Mát mẻ! Trong Ubuntu, bạn có thể hiển thị và nhận xét các dòng safe_path và env_reset. Làm cho hệ thống kém an toàn hơn đáng kể, vì vậy hãy cẩn thận.
RawwrBag

Vô hiệu hóa env_resetdường như không ảnh hưởng đến sudohành vi của W / r / t PATH.
Zanna

5

Những công việc này :

sudo $(which your_command)

Ví dụ gọi gpstập lệnh của tôi liệt kê các quy trình của GPU Nvidia:

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

Giải trình :

$ 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 safe_path cuối cùng của tôi


1

Điều này đã làm việc:

sudo "PATH=$PATH" [your command]

Không thay đổi $ PATH với giá trị đường dẫn của bạn, bạn chỉ cần viết nó theo cách này

thí dụ: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....


0

Có thể không chính xác những gì OP yêu cầu, nhưng điều này có thể giúp:

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

Điều này thay đổi PATH bên trong lệnh sudoed.

Chỉnh sửa: Tôi không chắc ý của tôi là gì, vì những điều trên là khá vô nghĩa. Sử dụng như sau thay thế:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.