Các tập lệnh yêu cầu sudo thất bại nếu họ không có nó, hoặc sử dụng sudo và prompt?


26

Tôi có một kịch bản cho phép tôi kiểm soát chi tiết độ sáng của đèn nền và yêu cầu sudochạy. Về cơ bản là thế này:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | tee $backlight

và sống tại ~/bin/backlight-adjust. Kịch bản cần sudođặc quyền, bởi vì tee $backlightđang viết đến một vị trí đặc quyền. Vì vậy, nó sẽ thất bại nếu nó không chạy với sudo.

Cách tiếp cận này có một vấn đề, vì tôi không thể chỉ cần chạy sudo backlight-adjust, vì ~/binkhông nằm trong $PATHtrong sudomôi trường, chỉ trong môi trường của tôi. Vì vậy, tôi phải chạy sudo env "PATH=$PATH" backlight-adjusthoặc một cái gì đó tương tự.

Ngoài ra, tôi có thể đã viết nó như thế này:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | sudo tee $backlight

và nhắc tôi nhập mật khẩu.

Cách tiếp cận thứ hai hoạt động tốt hơn đối với tôi vì tôi không phải nhớ gõ sudo; nó sẽ nhắc tôi Và tôi có thể giữ $PATHnguyên vẹn. Điều này cảm thấy thuận tiện hơn về tổng thể, nhưng có bất kỳ lý do tại sao tôi không nên làm theo cách thứ hai?

(Tôi đang chạy Xubfox 14.04 và trình bao của tôi là GNU bash 4.2.45, nếu điều đó tạo ra sự khác biệt.)


Cảm ơn vì sự đúng đắn của bạn. Tôi đang chạy một Debian (LMDE) đã được sửa đổi và tôi sudothực sự giữ nó $PATHtheo mặc định vì vậy tôi không gặp phải vấn đề này.
terdon

Câu trả lời:


27

Cá nhân, tôi sẽ sử dụng một cách tiếp cận khác. Tạo một bí danh cho kịch bản của bạn. Thêm dòng này vào ~/.bashrc(hoặc tương đương trong các shell khác)

alias backlight-adjust='sudo ~/bin/backlight-adjust'

Theo cách đó, bạn không cần phải lo lắng về việc nhớ chạy nó sudovà bạn không cần thêm sudotập lệnh. Nó sẽ hoàn toàn minh bạch với bạn và chỉ cần hỏi mật khẩu của bạn khi bạn thử và chạy backlight-adjust.


Đây có vẻ là một cách tiếp cận rất hợp lý và là phương pháp có tác động tối thiểu đến phần còn lại của hệ thống. +1.
John Women'sella

@JohnFeminella Mặt khác, nếu bạn muốn chia sẻ kịch bản này với bất kỳ ai khác, họ cũng sẽ cần bí danh. Cá nhân, tôi không thấy bất kỳ lý do nào để không đưa sudovào tập lệnh thực tế, đặc biệt là vì điều đó cho phép bạn dễ dàng xem các yếu tố nào của tập lệnh thực sự yêu cầu quyền root.
Kyle Strand

@KyleStrand không họ sẽ không. Lệnh được gọi bởi tập lệnh sẽ đơn giản phàn nàn về việc không có quyền truy cập.
terdon

@terdon Tôi nhận ra rằng tôi có thể đã rõ ràng hơn một chút, nhưng có lẽ bạn biết ý tôi là gì: người nhận kịch bản sẽ phải đối mặt với cùng một vấn đề mà tác giả của kịch bản phải đối mặt, và là một người chia sẻ kịch bản có lương tâm, tác giả nên cũng chia sẻ giải pháp cá nhân của họ cho tình huống khó xử sử dụng cụ thể này.
Kyle Strand

@KyleStrand có, nhưng không có vấn đề gì, vấn đề duy nhất mà OP gặp phải là anh ấy không muốn "phải nhớ gõ sudo", ngoài ra, kịch bản sẽ hoàn toàn di động. Quan điểm của tôi là bí danh là hoàn toàn tùy chọn và không giải quyết bất cứ điều gì, nó chỉ làm cho nó dễ sử dụng hơn.
terdon

7

Tôi không thể hiểu tại sao nó có thể không chính xác --- mặc dù tôi thường thích các lệnh đó sẽ không hỏi tôi điều gì, để chúng có thể được viết thành tập lệnh. Bạn có thể điều chỉnh /etc/sudoersđể sudolàm việc mà không cần mật khẩu.

Nhưng ... tại sao không thêm

chgrp  one-of-your-groups-here /sys/class/backlight/acpi_video0/brightness     
chmod g+w /sys/class/backlight/acpi_video0/brightness 

trong bạn /etc/rc.localvà quên đi sudo?

(Trong Ubuntu nếu bạn có thể sử dụng sudobạn thuộc nhóm sudo , vì vậy bạn có thể sử dụng chgrp sudo /sys...và hài lòng với nó.)


3

Ngoài ra, bạn có thể thêm

Defaults        env_keep +="PATH"

vào /etc/sudoerstập tin của bạn .


2

Bạn nêu điều chỉnh đèn nền sudo, vì ~ / bin không ở trong $ PATH trong môi trường sudo

Vậy tại sao lại phụ thuộc vào điều đó? Tôi nghĩ bạn chỉ nên thay đổi dòng /home/user/bin/backlight-adjustđó và nó sẽ hoạt động.

Nhưng tôi thực sự thích giải pháp sử dụng bí danh của Terdon. Hoặc bạn có thể đặt tập lệnh của mình vào /usr/bin/và tập lệnh sẽ có sẵn cho mọi người dùng (bao gồm cả root)


Có, nhưng thật khó chịu khi làm điều đó. Nếu không, điểm đặt nó vào $ PATH của tôi ở vị trí đầu tiên là gì? Ngoài ra, tôi thích có nó ~/binvì nó nằm trong kho lưu trữ dotfiles của nhà tôi, vì vậy nó nằm trong sự kiểm soát phiên bản.
John Women'sella

Nhân tiện, @JohnFeminella, không có lý do gì để thay đổi đường dẫn, chỉ cần sử dụng -Ecờ để bảo vệ môi trường:sudo -E command
terdon

@terdon Điều đó không hoạt động trong Debian; nó bị ghi đè vì lý do bảo mật. Bạn sẽ phải vượt qua các biến môi trường một cách rõ ràng, như tôi đã đề cập trong câu hỏi của tôi ( sudo env "PATH=$PATH" ...).
John Women'sella

1

Không thể đưa ra quy tắc chung ... nếu tập lệnh / chương trình được thiết kế để thực hiện một số cấu hình lại (ví dụ: máy in) và được gọi bởi người dùng thông thường, thì nó phải như vậy. Mặt khác, tôi sẽ để lại một mình đủ tốt: Nếu một người dùng thông thường chạy nó, chỉ là thất bại (do kết quả của một kiểm tra rõ ràng hoặc chỉ vì nó không được phép làm điều gì đó).

Đặc quyền nâng cao nên được đưa ra một cách tiết kiệm, nếu có. Chuyển sang đặc quyền cao hơn là khó khăn, tốt hơn là để lại cho các chuyên gia (tức là, sudo(1)).


0

Cá nhân tôi sử dụng một cái gì đó giống như ${SUDO}trong các kịch bản của mình, để người gọi có thể đặt nó nếu cần hoặc ${SUDO:-sudo}sử dụng nó theo mặc định.

Trong trường hợp cụ thể của bạn, tôi với câu trả lời được chấp nhận, mặc dù.


-1

Đặt tập lệnh (không có sudo) vào một vị trí phù hợp cho toàn người dùng, như thế /bin, và sau đó làm điều này:

sudo chown root /bin/backlight-adjust
sudo chmod 4755 /bin/backlight-adjust

Điều này hoạt động bằng cách đặt cờ setuid, có nghĩa là nó sẽ luôn được chạy với tư cách là chủ sở hữu tệp. Để biết chi tiết xin vui lòng đọc http://major.io/2007/02/13/chmod-and-the-mysterious-first-octet/ . Tôi thực sự không biết nhiều về cách thức hoạt động của nó, tôi chỉ thấy nó hoạt động dựa trên thứ mà tôi nghĩ rằng tôi đã đọc cách đây vài năm.


1
Các kịch bản Shell không thể được thiết lập thêm nữa, cảm ơn lòng tốt Đây là một câu trả lời hoàn toàn xấu xa, bạn biết đấy. An ninh-khôn ngoan, đặc biệt.
mirabilos

@mirabilos Nó chỉ nguy hiểm nếu bật cờ nhóm hoặc chung. Rủi ro với setuid là bất kỳ ai có quyền ghi cho tệp đều có thể chạy bất cứ thứ gì họ thích như thể họ là người dùng, và do đó, chính những quyền ghi này cần được bảo vệ. 4755có nghĩa là luôn luôn được thực thi với tư cách là chủ sở hữu, chủ sở hữu có thể đọc, viết và thực thi, nhóm có thể đọc và thực thi và người dùng có thể đọc và thực thi, đó là mức cấp phép tiêu chuẩn cho mọi thứ mà bất kỳ người dùng nào cũng được phép thực hiện với quyền root.
AJMansfield

@mirabilos Và ý tưởng rằng các kịch bản shell với setuid giới thiệu nhiều lỗ hổng hơn các nhị phân với setuid chỉ là ngớ ngẩn; nhị phân cũng không tránh khỏi khai thác ptrace, đây là khai thác chính lợi dụng setuid.
AJMansfield

2
Tất cả các hệ điều hành giống như Unix hiện tại đều cấm các tập lệnh setuid. Đây chỉ là một thực tế. Hãy tự hỏi họ vì lý do nếu bạn không tin tôi. Bắt đầu với OpenBSD.
mirabilos
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.