Làm cách nào để chạy các lệnh sudo cụ thể mà không cần mật khẩu?


211

Trên một máy cụ thể, tôi thường cần chạy sudocác lệnh mỗi giờ và sau đó. Tôi ổn với việc nhập mật khẩu sudotrong hầu hết các trường hợp.

Tuy nhiên, có ba sudolệnh tôi muốn chạy mà không cần nhập mật khẩu :

  • sudo reboot
  • sudo shutdown -r now
  • sudo shutdown -P now

Làm thế nào tôi có thể loại trừ các lệnh này từ bảo vệ mật khẩu đến sudo?


Câu trả lời:


283

Sử dụng NOPASSWDchỉ thị

Bạn có thể sử dụng NOPASSWDchỉ thị trong /etc/sudoerstập tin của bạn .

Nếu người dùng của bạn được gọi uservà máy chủ của bạn được gọi, hostbạn có thể thêm các dòng này vào /etc/sudoers:

user host = (root) NOPASSWD: /sbin/shutdown
user host = (root) NOPASSWD: /sbin/reboot

Điều này sẽ cho phép người dùng userchạy các lệnh mong muốn hostmà không cần nhập mật khẩu. Tất cả các sudolệnh ed khác vẫn sẽ yêu cầu mật khẩu.

Các lệnh được chỉ định trong sudoerstệp phải đủ điều kiện (nghĩa là sử dụng đường dẫn tuyệt đối đến lệnh để chạy) như được mô tả trong sudoerstrang man . Cung cấp một đường dẫn tương đối được coi là một lỗi cú pháp.

Nếu lệnh kết thúc bằng một /ký tự dấu và trỏ đến một thư mục, người dùng sẽ có thể chạy bất kỳ lệnh nào trong thư mục đó (nhưng không có trong bất kỳ thư mục con nào trong đó). Trong ví dụ sau, người dùng usercó thể chạy bất kỳ lệnh nào trong thư mục /home/someuser/bin/:

user host = (root) NOPASSWD: /home/someuser/bin/

Lưu ý: Luôn sử dụng lệnh visudođể chỉnh sửa sudoerstệp để đảm bảo bạn không tự khóa mình khỏi hệ thống - chỉ trong trường hợp bạn vô tình viết một cái gì đó không chính xác vào sudoerstệp. visudosẽ lưu tệp đã sửa đổi của bạn vào một vị trí tạm thời và sẽ chỉ ghi đè lên sudoerstệp thực nếu tệp được sửa đổi có thể được phân tích cú pháp mà không có lỗi.

Sử dụng /etc/sudoers.dthay vì sửa đổi/etc/sudoers

Thay thế cho việc chỉnh sửa /etc/sudoerstệp, bạn có thể thêm hai dòng vào một tệp mới, /etc/sudoers.dvd /etc/sudoers.d/shutdown. Đây là một cách thanh lịch để phân tách các thay đổi khác nhau đối với các sudoquyền và cũng khiến sudoerstệp gốc không bị ảnh hưởng để nâng cấp dễ dàng hơn.

Lưu ý: Một lần nữa, bạn nên sử dụng lệnh visudođể chỉnh sửa tệp để đảm bảo bạn không tự khóa mình khỏi hệ thống:

sudo visudo -f /etc/sudoers.d/shutdown 

Điều này cũng tự động đảm bảo rằng chủ sở hữu và quyền của tệp mới được đặt chính xác.

Nếu sudoersbị rối

Nếu bạn không sử dụng visudođể chỉnh sửa các tệp của mình và sau đó vô tình làm rối /etc/sudoershoặc làm hỏng một tệp trong /etc/sudoers.dđó thì bạn sẽ bị khóa sudo.

Giải pháp có thể là sửa các tệp bằng cách sử dụng pkexecthay thế sudo.

Để khắc phục /etc/sudoers:

pkexec visudo

Để khắc phục /etc/sudoers.d/shutdown:

pkexec visudo -f /etc/sudoers.d/shutdown

Nếu quyền sở hữu và / hoặc quyền không chính xác cho bất kỳ sudoerstệp nào , tệp sẽ bị bỏ qua do sudođó bạn cũng có thể thấy mình bị khóa trong tình huống này. Một lần nữa, bạn có thể sử dụng pkexecđể sửa lỗi này.

Các quyền chính xác phải như thế này:

$ ls -l /etc/sudoers.d/shutdown 
-r--r----- 1 root root 86 Jul 16 15:37 /etc/sudoers.d/shutdown

Sử dụng pkexecnhư thế này để sửa quyền sở hữu và quyền :

pkexec chown root:root /etc/sudoers.d/shutdown
pkexec chmod 0440 /etc/sudoers.d/shutdown

2
Hai dòng đề cập cụ thể đến hai lệnh này. Nếu userkhông theo các cách khác, các sudoquyền khác không được đưa ra bởi các người dùng khác. Có một cái nhìn man sudoman sudoers.
mgd

4
@StanKurdziel Tôi đã thử với dòng này trên Mac OS X Yosemite và nó hoạt động tốt : mgd ALL=(root) NOPASSWD: /var/root/test. Tôi là người dùng mgdALLcó nghĩa là "từ tất cả các máy chủ" . /var/root/testlà một tập lệnh shell "Hello World" đơn giản với các quyền : -rwx------ 1 root wheel 27 12 Jun 09:54 /var/root/test. Tôi không thực hiện thay đổi nào khác cho hệ thống.
mgd

2
Có gì hosttrong tập tin sudoers?
dùng106563

1
Đây không phải là một câu trả lời, nó gần như là hướng dẫn đầy đủ về chỉ thị NOPASSWD. Cảm ơn bạn.
Xóa

1
@Michael vui lòng đọc trang người đàn ông. Tất cả được viết ở đó. Để trích dẫn nó: Tuy nhiên, bạn cũng có thể chỉ định các đối số dòng lệnh (bao gồm cả ký tự đại diện). Thay phiên, bạn có thể chỉ định "" để chỉ ra rằng lệnh chỉ có thể được chạy mà không có đối số dòng lệnh.
mgd

3

Xin lỗi nhưng có quá nhiều nhầm lẫn về điều này và một số câu trả lời thực sự phức tạp, đến nỗi tôi cảm thấy mình phải cân nhắc ở đây trước khi ai đó hiểu lầm và làm điều gì đó điên rồ.

Sử dụng visudo !!

Thêm các dòng sau vào cấu hình:

ALL ALL=NOPASSWD: /sbin/reboot,/sbin/shutdown

Điều này cho phép các lệnh, khởi động lại và tắt máy với bất kỳ tham số nào được thực thi từ bất kỳ người dùng nào.

Hãy stackexchange, chỉ cần đưa ra câu trả lời ngắn gọn đơn giản.

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.