Sau đây là trường hợp bạn muốn chạy lệnh mà không cần mật khẩu nếu nó có một bộ tùy chọn cụ thể, trong đó một phần của các tùy chọn là biến . AFAIK không thể sử dụng các biến hoặc phạm vi giá trị trong khai báo sudoers, tức là bạn có thể cho phép truy cập rõ ràng command option1
nhưng không command option2
sử dụng:
user_name ALL=(root) /usr/bin/command option1
nhưng nếu cấu trúc là command option1 value1
, nơi value1
có thể thay đổi, bạn sẽ cần phải có các dòng sudoers rõ ràng cho mỗi giá trị có thể của value1
. Shell script cung cấp một cách xung quanh nó.
Câu trả lời này được lấy cảm hứng từ câu trả lời của M. Ahmad Zafar và khắc phục vấn đề bảo mật ở đó.
- Tạo một kịch bản shell mà bạn gọi lệnh mà không có
sudo
.
- Lưu tập lệnh trong thư mục đặc quyền gốc (ví dụ
/usr/local/bin/
), làm cho tập tin gốc sở hữu (ví dụ chown root:wheel /usr/local/bin/script_name
) không có quyền truy cập ghi cho người khác (ví dụ chmod 755 /usr/local/bin/script_name
).
Thêm ngoại lệ cho sudoers bằng visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
Chạy kịch bản của bạn sudo script_name
.
Ví dụ: tôi muốn thay đổi thời gian chờ hiển thị trên macOS. Điều này được thực hiện bằng cách sử dụng:
sudo pmset displaysleep time_in_minutes
Tôi xem xét việc thay đổi thời gian chờ ngủ là một hành động vô tội không biện minh cho sự rắc rối của việc nhập mật khẩu, nhưng pmset
có thể làm nhiều việc và tôi muốn giữ những điều khác đằng sau mật khẩu sudo.
Vì vậy, tôi có kịch bản sau đây tại /usr/local/bin/ds
:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
Cuối sudoers
tập tin tôi có dòng sau:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Để đặt thời gian chờ là 3 phút, tôi chạy tập lệnh của mình từ tài khoản người dùng thông thường user_name
:
sudo ds 3
PS Hầu hết các tập lệnh của tôi là xác thực đầu vào, không bắt buộc, do đó, những điều sau đây cũng sẽ hoạt động:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
là một kịch bản python?