`/ etc / sudoers` - chỉ định` env_keep` cho một lệnh duy nhất?


23

Có cách nào để chỉ định rằng chỉ sudonên bảo tồn các biến môi trường nhất định cho các lệnh được chỉ định không? Đối với một số mục đích tôi muốn $HOMEenv của tôi . biến được bảo tồn khi tôi chạy các lệnh nhất định. Đối với các mục đích khác và các lệnh khác, tôi muốn nó thiết lập lại. Điều này có thể được thực hiện với /etc/sudoers?

Chỉnh sửa:

cảm ơn về những câu trả lời. Tôi tự hỏi nếu tôi có thể hỏi một câu hỏi tiếp theo, đó là "Tại sao, sau đó, điều này không hoạt động?"

Trong ví dụ tôi đang cố gắng để làm việc, tôi muốn sudo nanođọc của tôi $HOME/.nanorc. Nếu tôi sử dụng điều này:

Defaults:simon env_keep=HOME

nó hoạt động hoàn hảo. Nếu tôi sử dụng điều này:

Defaults!/bin/nano env_keep=HOME

hoặc này:

Cmnd_Alias      NANO = /usr/bin/nano,/bin/nano,/bin/rnano
Defaults!NANO   env_keep=HOME

nó hoàn toàn không hoạt động. Bất kỳ đề nghị như tại sao? (Tôi đang thử nghiệm Debian, btw.)

(Lưu ý: Tôi không nghĩ nó nanocụ thể, btw - Tôi có thể tái tạo hành vi bằng một tập lệnh bash một dòng chỉ đơn giản là echos $HOME).


1
Thay vì cố gắng để nano chạy qua sudo để sử dụng cùng một tệp cấu hình, hãy sử dụng sudoeditthay thế. sudoeditsẽ chạy sao chép nội dung của tệp vào tệp tmp và chạy trình soạn thảo bạn chọn với tư cách là người dùng của bạn, khi trình chỉnh sửa thoát, nó sẽ kiểm tra xem bạn có thay đổi gì không và nếu thay thế bản gốc bằng tệp đã chỉnh sửa. Bạn có thể chọn trình soạn thảo nào bạn muốn nó chạy bằng cách đặt $EDITORhoặc vars $ VISUAL` env.
Arrowmaster

@Arrowmaster - cảm ơn, đó có vẻ là một cách tiếp cận tốt hơn so với cách tôi đang làm phiền. Vì tôi đã gói sudomột chức năng của riêng mình, tôi chỉ cần thêm một if [ "$1" == "$EDITOR" ]; thenkhối và hiện đang gọi sudoeditthay thế :)
simon

Câu trả lời:


21

Để ghi đè env_keepchỉ cho /path/to/command(khi được gọi thông qua bất kỳ quy tắc nào, bởi bất kỳ người dùng nào) và cho người dùng joe(bất kể anh ta đang chạy lệnh nào):

Defaults!/path/to/command env_keep=HOME
Defaults:joe env_keep=HOME

Bạn có thể sử dụng -=hoặc +=để loại bỏ hoặc thêm một mục vào env_keepdanh sách.


rực rỡ, cảm ơn bạn. Tôi không thể tìm thấy một ví dụ thích hợp của cú pháp đó. Bây giờ bạn đánh vần nó cho tôi, tôi có thể thấy tôi nên làm việc đó ra khỏi mantrang như thế nào và tôi cảm thấy hơi ngốc nghếch. Không có nghi ngờ câu trả lời này cũng sẽ giúp người khác.
simon

1
@simon: Đừng cảm thấy ngu ngốc, tôi cũng thấy mô tả cú pháp trong sudoerstrang man khó tìm ra từ mô tả chính thức và các ví dụ dễ tìm hơn nếu bạn đã biết cách viết chúng.
Gilles 'SO- ngừng trở nên xấu xa'

hmm - có lẽ tôi đã nói chuyện sớm Bây giờ tôi thử điều này, tôi thực sự không thể làm cho nó hoạt động. Tôi có thể làm phiền bạn để xem bản sửa đổi của tôi không?
simon

1
@simon: Tôi đoán là bạn cũng có một mục cho phép bạn làm mọi thứ và không có env_keepcài đặt đó ( simon ALL = ALL). Sudo sử dụng mục phù hợp cuối cùng .
Gilles 'SO- ngừng trở nên xấu xa'

Coi chừng, nếu Secure_path được đặt, bạn cũng sẽ phải thêm Mặc định: joe!
Secure_path

6
Cmnd_Alias      PBUILDER = /usr/sbin/pbuilder,/usr/sbin/cowbuilder
Defaults!PBUILDER       env_keep+=HOME

Những dòng này là của riêng tôi /etc/sudoersđể khắc phục sự cố pbuildertìm $HOMEtệp cấu hình người dùng của nó nhưng phải được chạy dưới quyền root (chuyển nó sang /rootloại bỏ mục đích có cả hệ thống và tệp cấu hình người dùng).


Vâng, đó là một trường hợp sử dụng rất giống với trường hợp tôi đã nghĩ, cảm ơn!
simon

Bạn có biết tại sao các ví dụ trong bản sửa đổi của tôi dường như không hoạt động không?
simon

@simon sudo rất kén chọn thứ tự của các mục trong cấu hình của nó, các mục sau này sẽ ghi đè lên các mục trước đó. Có thể có một số xung đột như thế trong cấu hình của bạn.
Arrowmaster

1

người đàn ông sudoers:

   env_reset       If set, sudo will reset the environment to only contain
                   the LOGNAME, SHELL, USER, USERNAME and the SUDO_*
                   variables.  Any variables in the caller’s environment
                   that match the env_keep and env_check lists are then
                   added.  The default contents of the env_keep and
                   env_check lists are displayed when sudo is run by root
                   with the -V option.  If the secure_path option is set,
                   its value will be used for the PATH environment
                   variable.  This flag is on by default.

Do đó có, bạn có thể làm điều đó bằng env_reset, env_keepenv_checktrong tập tin / etc / sudoers.

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.