it-swarm-vi.com

Làm thế nào để chạy một chương trình cụ thể như root mà không cần nhắc mật khẩu?

Tôi cần chạy một cái gì đó như Sudo mà không cần mật khẩu, vì vậy tôi đã sử dụng visudo và thêm nó vào tệp sudoers của tôi:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Sau đó, tôi đã thử nó:

$ Sudo /path/to/my/program
[Sudo] password for MYUSERNAME: 

Tại sao nó yêu cầu mật khẩu? Làm cách nào tôi có thể chạy/sử dụng các lệnh với quyền root với người dùng không phải root, mà không yêu cầu mật khẩu?

175
LanceBaynes

Bạn có một mục khác trong tệp sudoers , thường nằm ở /etc/sudoers, cũng phù hợp với người dùng của bạn. Quy tắc NOPASSWD cần phải theo sau quy tắc đó để được ưu tiên.

Làm xong việc đó, Sudo sẽ Nhắc mật khẩu bình thường cho tất cả các lệnh trừ /path/to/my/program, nó sẽ luôn cho phép bạn chạy mà không cần hỏi mật khẩu.

97
Warren Young

Nếu có nhiều mục phù hợp trong /etc/sudoers, Sudo sử dụng cái cuối cùng. Do đó, nếu bạn có thể thực thi bất kỳ lệnh nào bằng Prompt mật khẩu và bạn muốn có thể thực thi một lệnh cụ thể mà không cần mật khẩu Nhắc, bạn cần ngoại lệ cuối cùng.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Lưu ý việc sử dụng (root), để cho phép chương trình được chạy dưới quyền root nhưng không phải như những người dùng khác. (Không cung cấp nhiều quyền hơn mức tối thiểu được yêu cầu trừ khi bạn nghĩ ra hàm ý.)

Lưu ý cho những độc giả không chạy Ubuntu hoặc đã thay đổi cấu hình Sudo mặc định (Sudo của Ubuntu theo mặc định) : Chạy các tập lệnh Shell với các đặc quyền nâng cao là rủi ro, bạn cần bắt đầu từ một môi trường sạch (một khi Shell đã bắt đầu thì đã quá muộn (xem Cho phép setuid trên các tập lệnh Shell ), vì vậy bạn cần Sudo để xử lý việc đó). Hãy chắc chắn rằng bạn có Defaults env_reset trong /etc/sudoers hoặc tùy chọn này là mặc định thời gian biên dịch (Sudo sudo -V | grep env nên bao gồm Reset the environment to a default set of variables).

139

[~ # ~] cảnh báo [~ # ~] : Câu trả lời này đã được coi là không an toàn. Xem bình luận bên dưới

Giải pháp hoàn chỉnh: Các bước sau sẽ giúp bạn đạt được đầu ra mong muốn:

  1. Tạo một tập lệnh mới (thay thế create_dir.sh với tên tập lệnh mong muốn của bạn):

    vim ~/create_dir.sh
    

    Kịch bản sẽ được tạo trong thư mục nhà của người dùng

  2. Thêm một số lệnh mà chỉ người dùng root hoặc Sudo có thể thực thi như tạo thư mục ở cấp thư mục gốc:

    mkdir /abc
    

    Lưu ý: Don lồng thêm Sudo vào các lệnh này. Lưu và thoát (sử dụng :wq!)

  3. Gán quyền thực thi cho nó bằng cách sử dụng:

    Sudo chmod u+x create_dir.sh
    
  4. Thực hiện các thay đổi để tập lệnh này không yêu cầu mật khẩu.

    1. Mở tệp sudoers:

      Sudo visudo -f /etc/sudoers
      
    2. Thêm dòng sau vào cuối:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Thay thế ahmad bằng tên người dùng của bạn. Cũng đảm bảo rằng đây là dòng cuối cùng. Lưu và thoát.

  5. Bây giờ khi chạy lệnh thêm Sudo trước khi nó như sau:

    Sudo ./create_dir.sh
    

    Điều này sẽ chạy các lệnh bên trong tệp tập lệnh mà không yêu cầu mật khẩu.

Thực hiện theo các bước dễ dàng được đề cập tại đây http://step4wd.com/2013/09/14/run-root-commands-in-linux-ub Ubuntu-without-password /

24
M. Ahmad Zafar

Tôi nghĩ rằng cú pháp của bạn là sai. Ít nhất tôi sử dụng những điều sau đây làm việc cho tôi:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
12
musiKk

Nếu bạn muốn tránh phải sử dụng Sudo cũng như không phải thay đổi tệp cấu hình sudoers, bạn có thể sử dụng:

Sudo chown root:root path/to/command/COMMAND_NAME
Sudo chmod 4775 path/to/command/COMMAND_NAME

Điều này sẽ làm cho lệnh chạy như root mà không cần Sudo.

6
linuxgnuru

Nếu bạn có một bản phân phối như Manjaro, trước tiên bạn phải xử lý một tệp ghi đè định nghĩa/etc/sudoers, bạn có thể xóa nó hoặc làm việc trực tiếp với tệp đó để thêm cấu hình mới của bạn.

Tập tin này là:

Sudo cat /etc/sudoers.d/10-installer

Cách DUY NHẤT để xem nó nằm dưới quyền root, bạn không thể liệt kê thư mục này mà không có nó, tệp này là Manjaro cụ thể, bạn có thể tìm thấy cấu hình này với tên khác, nhưng trong cùng thư mục.

Trong tệp bạn chọn, bạn có thể thêm (các) dòng sau để có (các) cấu hình mong muốn:

Bỏ qua xác thực cho một nhóm

%group ALL=(ALL) NOPASSWD: ALL

hoặc Bỏ qua xác thực cho người dùng

youruser ALL=(ALL) NOPASSWD: ALL

hoặc Bỏ qua xác thực một thực thi cho một người dùng cụ thể

youruser ALL=(ALL) NOPASSWD: /path/to/executable

LƯU Ý NHANH: Bạn đang mở một cánh cửa để sử dụng Sudo mà không cần xác thực, điều đó có nghĩa là bạn có thể chạy mọi thứ sửa đổi mọi thứ từ hệ thống của mình, sử dụng nó với khả năng đáp ứng.

5
Lyoneel

Xác minh rằng Sudo không có bí danh. Chạy như thế này

/usr/bin/Sudo /path/to/my/program

Ví dụ, một bí danh Shell như thế này:

alias Sudo="Sudo env PATH=$PATH"

có thể gây ra hành vi này.

4
Sepero

Điều này đã giải quyết vấn đề cho tôi (cũng đã thử một số câu trả lời khác, có thể có ích):

Kịch bản tôi đang gọi là trong /usr/bin, một thư mục mà tôi không có quyền ghi (mặc dù tôi thường có thể đọc bất kỳ tệp nào ở đó). Kịch bản được chmodded + x (permisison thực thi), nhưng nó vẫn không hoạt động. Di chuyển tệp này đến một đường dẫn trong thư mục nhà của tôi, thay vì /usr/bin, Cuối cùng tôi đã có thể gọi nó bằng Sudo mà không cần nhập mật khẩu.

Ngoài ra một điều tôi nghi ngờ (làm rõ cho những độc giả tương lai): Bạn cần chạy kịch bản của mình dưới dạng Sudo. Nhập Sudo khi đang gọi tập lệnh. Không sử dụng Sudo cho lệnh bên trong tập lệnh của bạn thực sự cần root (thay đổi đèn nền bàn phím trong trường hợp của tôi). Có lẽ điều đó cũng hiệu quả, nhưng bạn không cần, và có vẻ như đó không phải là giải pháp tốt hơn.

2
Luc

Khi bạn thực thi tập lệnh của mình, bạn cần chạy nó dưới dạng Sudo /path/to/my/script.

Chỉnh sửa : Dựa trên nhận xét của bạn cho câu trả lời khác, bạn muốn chạy nó từ một biểu tượng. Bạn sẽ cần tạo tệp .desktop Thực thi chương trình của bạn bằng Sudo, giống như trên thiết bị đầu cuối.

Bạn cũng có thể xem xét sử dụng gtk-Sudo Cho mật khẩu trực quan Nhắc.

Có lẽ bạn nên xem xét ý tưởng rằng bạn không nên chạy mọi thứ như root và thay đổi hệ thống ở xa hơn để bạn không cần quyền root hoàn toàn sẽ là cách tốt hơn.

2
Caleb

Một khả năng khác có thể là cài đặt, định cấu hình, sau đó sử dụng lệnh super để chạy tập lệnh của bạn dưới dạng

super /path/to/your/script

Nếu bạn muốn chạy một số nhị phân thực thi (ví dụ: bạn đã biên dịch thành ELF nhị phân từ một số mã nguồn C) không một tập lệnh- là root, bạn có thể xem xét việc tạo nó setuid (và thực tế /bin/login, /usr/bin/Sudo/bin/susuper đều sử dụng kỹ thuật đó). Tuy nhiên, hãy cẩn thận, bạn có thể mở một lỗ hổng bảo mật rất lớn .

Cụ thể, chương trình của bạn nên được mã hóa một cách hoang tưởng (vì vậy hãy kiểm tra tất cả các đối số và môi trường và các điều kiện bên ngoài trước khi "hành động", giả sử người dùng có khả năng thù địch), sau đó bạn có thể sử dụng seteuid (2) và bạn bè (xem cũng setreuid (2) ) một cách cẩn thận (xem thêm khả năng (7) & thông tin đăng nhập (7) & thực hiện (2) ...)

Bạn sẽ sử dụng chmod u+s (đọc chmod (1) ) khi cài đặt nhị phân như vậy.

Nhưng hãy cẩn thận .

Đọc nhiều điều về setuid, bao gồm Lập trình Linux nâng cao , trước khi mã hóa một thứ như vậy.

Lưu ý rằng một tập lệnh, hoặc bất kỳ Shebang - ed điều, không thể được thiết lập. Nhưng bạn có thể mã hóa (bằng C) một setuid-binary nhỏ.

1
Basile Starynkevitch

Lý tưởng nhất là nếu bạn đang tùy chỉnh những lệnh nào có thể được chạy qua Sudo bạn nên thực hiện những thay đổi này trong một tệp riêng biệt trong /etc/sudoers.d/ Thay vì chỉnh sửa trực tiếp tệp sudoers. Bạn cũng nên luôn luôn sử dụng visudo để chỉnh sửa (các) tệp. Bạn KHÔNG BAO GIỜ cấp NOPASSWD cho các lệnh ALL.

Ví dụ: Sudo visudo -f /etc/sudoers.d/mynotriskycommand

Chèn quyền cấp phép dòng của bạn: myuser ALL= NOPASSWD: /path/to/your/program

Sau đó lưu và thoát và visudo sẽ cảnh báo bạn nếu bạn có bất kỳ lỗi cú pháp nào.

Bạn có thể chạy Sudo -l Để xem các quyền mà người dùng của bạn đã được cấp, nếu bất kỳ lệnh NOPASSWD cụ thể nào của người dùng xuất hiện TRƯỚC bất kỳ lệnh %groupyouarein ALL=(ALL) ALL nào trong đầu ra bạn sẽ nhắc nhập mật khẩu của bạn.

Nếu bạn thấy mình tạo ra nhiều tệp sudoers.d này thì có lẽ bạn sẽ muốn tạo chúng theo tên cho mỗi người dùng để họ dễ hình dung hơn. Hãy nhớ rằng thứ tự của TÊN TÊN TÊN và các QUY TẮC trong tệp là rất quan trọng, LAST một lần tải sẽ thắng, cho dù nó HƠN hay ÍT hơn so với các mục trước.

Bạn có thể kiểm soát thứ tự tên tệp bằng cách sử dụng tiền tố 00-99 hoặc aa/bb/cc, tuy nhiên, hãy nhớ rằng nếu bạn có BẤT K file tệp nào không có tiền tố số, chúng sẽ tải sau các tệp được đánh số, ghi đè các thiết lập. Điều này là do tùy thuộc vào cài đặt ngôn ngữ của bạn, "sắp xếp từ vựng" mà Shell sử dụng các số sắp xếp trước và sau đó có thể xen kẽ chữ hoa và chữ thường khi sắp xếp theo thứ tự "tăng dần".

Hãy thử chạy printf '%s\n' {{0..99},{A-Z},{a-z}} | sortprintf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort Để xem liệu ngôn ngữ hiện tại của bạn có in AaBbCc etc hoặc ABC sau đó abc để xác định "tốt nhất" cuối cùng là gì "Tiền tố thư để sử dụng sẽ là.

0
dragon788

Thay phiên, bạn có thể sử dụng gói python pudo .

Cài đặt:

user$ Sudo -H pip3 install pudo # you can install using pip2 also

Dưới đây là đoạn mã để sử dụng in python tự động hóa để chạy các lệnh theo đặc quyền gốc:

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

Dưới đây là ví dụ cmd để chạy các lệnh dưới quyền root:

user$ pudo ls /root
Desktop  Downloads  Pictures  Music
0
Madhusudhan Kasula

Để cho phép bất kỳ người dùng nào thực hiện chương trình dưới dạng Sudo mà không cần hỏi mật khẩu, bạn có thể thêm dòng sau

%Sudo ALL=(root) NOPASSWD: /path/to/your/program

trong /etc/sudoers

Lưu ý rằng % Sudo tạo ra nó.

0
ultimatex

Sau đây là trường hợp bạn muốn chỉ chạy một lệnh không có 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 vào command option1 Nhưng không sử dụng command option2

user_name ALL=(root) /usr/bin/command option1

nhưng nếu cấu trúc là command option1 value1, trong đó 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 ở đó.

  1. Tạo tập lệnh Shell trong đó bạn gọi lệnh mà không cần Sudo.
  2. 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 sở hữu gốc (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).
  3. Thêm ngoại lệ cho sudoers bằng visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Chạy tập lệnh 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 thứ khác đằng sau mật khẩu Sudo.

Vì vậy, tôi có tập lệnh sau 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 tệp sudoers 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 
0
Koit Saarevet