Câu hỏi Làm cách nào để chạy các lệnh sudo cụ thể mà không có mật khẩu?


Trên một máy cụ thể tôi thường cần chạy sudo các lệnh ngay bây giờ và sau đó. Tôi ổn khi nhập mật khẩu vào sudo trong hầu hết các trường hợp.

Tuy nhiên có số ba sudo lệ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 cách nào để loại trừ các lệnh này khỏi bảo vệ bằng mật khẩu sudo?


188
2017-07-03 08:31


gốc


Tương tự như Làm thế nào để cho phép thực hiện mà không cần sử dụng sudo? - fouric


Các câu trả lời:


Sử dụng NOPASSWD chỉ thị

Bạn có thể dùng NOPASSWD chỉ thị trong /etc/sudoers tập tin.

Nếu người dùng của bạn được gọi user và máy chủ của bạn được gọi host bạn có thể thêm những 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 user để chạy các lệnh mong muốn host mà không cần nhập mật khẩu. Tất cả khác sudolệnh ed sẽ vẫn yêu cầu mật khẩu.

Các lệnh được chỉ định trong sudoers tập tin phải đủ điều kiện (tức là sử dụng đường dẫn tuyệt đối cho lệnh để chạy) như được mô tả trong sudoers trang người đàn ông. Cung cấp đường dẫn tương đối được coi là lỗi cú pháp.

Nếu lệnh kết thúc bằng dấu / ký tự và các điểm vào 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 user có thể chạy bất kỳ lệnh nào trong thư mục /home/someuser/bin/:

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

Chú thích: Luôn sử dụng lệnh visudo để chỉnh sửa sudoers để đảm bảo rằng bạn không khóa chính mình khỏi hệ thống - chỉ trong trường hợp bạn vô tình viết nội dung nào đó không chính xác cho sudoers tập tin. visudo sẽ lưu tệp đã sửa đổi của bạn vào một vị trí tạm thời và sẽ chỉ có ghi đè lên thực tế sudoers tệp 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.d thay vì sửa đổi /etc/sudoers

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

Chú thích: 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 sudoers bị rối tung lên

Nếu bạn không sử dụng visudo để chỉnh sửa các tệp của bạn và sau đó vô tình làm hỏng /etc/sudoers hoặc làm hỏng một tập tin 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 pkexec đó là một thay thế cho sudo.

Sửa chữa /etc/sudoers:

pkexec visudo

Sửa chữa /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ỳ sudoers tệp, tệp sẽ bị bỏ qua sudo vì vậy 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ư sau:

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

Sử dụng pkexec như 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

253
2017-07-03 08:43



tôi hy vọng điều này sẽ chỉ áp dụng cho 2 lệnh này và tôi sẽ không gây rối với phần còn lại của hệ thống hoặc bất kỳ lệnh nào khác? - Z9iT
Hai dòng này đề cập cụ thể đến hai lệnh này. Nếu user không phải theo những cách khác sudo quyền không có lệnh khác có thể được sudoed bởi người dùng này. Hãy xem man sudo và man sudoers. - mgd
Ban đầu tôi phải đối mặt với một vấn đề chmod .. thêm một tập luyện vào điều này trong câu trả lời .. thanx @mgd - Z9iT
@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 mgd và ALL có nghĩa "từ tất cả các máy chủ". /var/root/test là một tập lệnh shell "Hello World" đơn giản với quyền: -rwx------ 1 root wheel 27 12 Jun 09:54 /var/root/test. tôi đã làm Không các thay đổi khác đối với hệ thống. - mgd
@ Michael xin vui lòng đọc trang người đàn ông. Tất cả đều được viết ở đó. Để báo giá: Tuy nhiên, bạn cũng có thể chỉ định đối số dòng lệnh (bao gồm cả ký tự đại diện). Cách khác, bạn có thể chỉ định "" để chỉ ra rằng lệnh chỉ có thể chạy mà không có đối số dòng lệnh. - mgd