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?


169

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 visudovà thêm nó vào sudoerstập tin của mình :

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?

Câu trả lời:


91

Bạn có một mục khác trong sudoerstệp cũng phù hợp với người dùng của bạn. Các NOPASSWDquy tắc cần phải sau đó một để cho nó để được ưu tiên.

Làm xong việc đó, sudosẽ nhắc nhập mật khẩu bình thường cho tất cả các lệnh ngoại 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.


6
điều này sẽ vẫn hoạt động nếu đó /path/to/my/programlà một kịch bản python?
sadmicrowave

Có thể chương trình thay vì là một bí danh, đặt ra cho bash (tức là trong .bashrc)? Hay thậm chí là một kịch bản shell bên trong /usr/local/sbin? Để thử.
Nikos Alexandris

Nikos - không nó không thể là bí danh. Nó phải chỉ ra một con đường thực sự.
Paul Hedderly

sudo? ở đâu? sử dụng câu trả lời của bạn (
Vasilii Suricov

@VasiliiSuricov: Nó thường ở /etc, nhưng một số hệ thống đặt nó ở nơi khác. Nếu bạn không thể tìm thấy nó, hãy thử man sudoers. Vị trí cục bộ cho tệp đó nên được thay thế vào mantrang tại thời điểm sudođược xây dựng cho hệ thống đó.
Warren trẻ

135

Nếu có nhiều mục phù hợp trong /etc/sudoers, sudo sử dụng mục cuối cùng. Do đó, nếu bạn có thể thực thi bất kỳ lệnh nào bằng dấu nhắc 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 dấu nhắc mật khẩu, bạn cần có 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. (Đừng đưa ra 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 ý đối với những độc giả không chạy Ubuntu hoặc đã thay đổi cấu hình sudo mặc định (mặc định sudo của Ubuntu vẫn ổn) : Chạy các kịch bản 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 (khi shell đã bắt đầu, đã quá muộn (xem Cho phép setuid trên shell script ), vì vậy bạn cần sudo để xử lý vấn đề đó). Hãy chắc chắn rằng bạn có Defaults env_resettrong /etc/sudoershoặc rằng tùy chọn này là mặc định thời gian biên dịch ( sudo sudo -V | grep envbao gồm Reset the environment to a default set of variables).


3
ex để đi root từ jhon với sudo su an no pass -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac

5
@adrian Nếu bạn muốn cho phép các lệnh tùy ý làm root, hãy thực hiện điều đó john ALL=(ALL) NOPASSWD: all. Không có điểm nào để đi qua su.
Gilles

Câu hỏi: tôi có nên thay đổi quyền của tập lệnh shell của mình để nó có thể được sửa đổi và chỉ đọc bởi người dùng root, để bảo mật? Tôi đang nghĩ về một kẻ tấn công sửa đổi tập lệnh, trong đó có tất cả các quyền được cấp mà không cần mật khẩu, để nó thực hiện những gì anh ấy / cô ấy muốn. Rõ ràng, kẻ tấn công thậm chí không thể đọc tệp sudoers để biết tập lệnh nào có đặc quyền này, nhưng vẫn có thể thử với tất cả các tập lệnh tùy chỉnh của tôi khi anh ấy / cô ấy tìm thấy thư mục được lưu trữ với hy vọng một số được cho phép hoặc một cái gì đó tương tự .
Jeffrey Lebowski

1
@JeffreyLebowski Nếu bạn có quy tắc sudo chạy tập lệnh (trực tiếp hoặc gián tiếp) thì điều quan trọng là chỉ có root (hoặc những người có quyền root) mới có thể ghi vào tệp tập lệnh và vào thư mục chứa tệp tập lệnh và thư mục mẹ của nó và như vậy. Không ai có thể đọc tệp tập lệnh (trừ khi nó chứa mật khẩu hoặc thứ gì đó, nhưng đó là một ý tưởng tồi, nếu có mật khẩu thì nó phải nằm trong tệp của chính nó, nếu không thì có quá nhiều nguy cơ vô tình làm rò rỉ nó, ví dụ như sao chép-dán phần đó của mã trong một câu hỏi trên trang web này).
Gilles

1
@alper Không. Rất ít thứ yêu cầu khởi động lại. Sau khi thay đổi sudoers, bạn không cần phải làm gì đặc biệt: sudokiểm tra nó mỗi lần.
Gilles

24

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 tệp tập lệnh mới (thay thế create_dir.shbằng tên tập lệnh bạn muốn):

    vim ~/create_dir.sh
    

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

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

    mkdir /abc
    

    Lưu ý: Đừng thêm sudovà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. Thay đổi để tập lệnh này không yêu cầu mật khẩu.

    1. Mở sudoerstệp:

      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ế ahmadbằ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 sudotrướ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 script mà không yêu cầu mật khẩu.

Thực hiện theo các bước đơn giản được đề cập tại đây http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubfox-without-password/


Sẽ tốt hơn nếu bạn cung cấp các bước có liên quan ở đây và sử dụng liên kết làm bản sao lưu để biết thêm thông tin chi tiết. Bằng cách đó, câu trả lời của bạn vẫn giữ được giá trị có thể ngay cả khi liên kết đó sẽ không còn hiệu lực nữa.
Anthon

15
Lời khuyên này không an toàn. Các sudophần của sudo chmod u+x create_dir.shlà không cần thiết như là người dùng có (có lẽ) quyền sở hữu / dir nhà của mình. Vì người dùng có thể viết thư create_dir.sh, bạn đã cung cấp một root root miễn phí cho người dùng đó một cách hiệu quả.
Lekensteyn

1
@Lekensteyn Điều đó cũng có nghĩa là bất kỳ chương trình nào đang chạy với tư cách là người dùng. Cũng có thể chỉ cho phép người dùng chạy bất cứ thứ gì với sudo mà không cần mật khẩu.
pydsigner

2
Tui bỏ lỡ điều gì vậy? Tôi tin rằng toàn bộ chmodlà không cần thiết, vì bạn đang dựa vào sudođể nâng cao các đặc quyền của mình.
G-Man

10

Tôi nghĩ 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

6
Phần (ALL)này là tùy chọn, để lại nó có tác dụng chính xác như nhau. Có (root)sẽ tốt hơn mặc dù, nhưng sự vắng mặt của nó không giải thích vấn đề.
Gilles

+1 cho sudo cho lệnh này và không có gì khác! Không có lý do để phá vỡ toàn bộ hệ thống ...
Johan

3
@Johan: Điều đó đã có trong câu hỏi.
Gilles

5

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.


Ồ, tôi chưa bao giờ nghe về giải pháp này trước đây, tâm trí boggling
một cái gì đó

Tại sao tôi cần phải cuộn xuống dưới cùng của những điều này để tìm câu trả lời tốt nhất? Cảm ơn giải pháp an toàn đơn giản này.
RyanNerd

5

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 củ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ó là theo đặc quyền gốc, 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.


4

Xác minh rằng sudo không 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.


Bạn nói đúng, nhận xét của tôi đã bị lỗi ở đây , xin lỗi vì điều đó. Tuy nhiên, tôi tò mò - làm thế nào bạn mong muốn răng cưa thay đổi việc xử lý sudoersbằng sudo. Hay bạn đang nói về việc chuyển hướng sudođến một cái gì đó luôn in thông báo lỗi này để lấy mật khẩu? Đó là điều không thể xảy ra ở đây ...
peterph

2
Tôi đã có cùng một vấn đề như OP. Hóa ra là do có alias sudo="sudo env PATH=$PATH"trong tôi ~/.bashrc. Thay vì chỉ giải quyết nó cho bản thân và mù quáng đi về doanh nghiệp của mình, tôi đã gửi câu trả lời của mình như một giải pháp khả thi cho bất kỳ ai khác đi theo chủ đề này.
Sepero

1
Điều đó tốt, nhưng khi nó không rõ ràng (trong trường hợp này ít nhất là với một số người), thật tốt khi đưa ra lời giải thích vào câu trả lời để cung cấp một số bối cảnh và ngăn mọi người sử dụng phép thuật một cách mù quáng. +2 (- (- 1) + +1). :)
peterph

2

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 một .desktoptệp 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-sudocho một dấu nhắc mật khẩu trực quan.

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.


7
Đừng tạo kịch bản shell setuid . Xem Cho phép setuid trên các tập lệnh shell .
Gilles

Tôi đã cân nhắc thậm chí không đề cập đến nó bởi vì đó là một lựa chọn tồi. Tôi vừa xóa nó vì tôi lo lắng người hỏi này có thể sử dụng lời khuyên ngay cả với lời cảnh báo rằng đó là lời khuyên tồi!
Caleb

2

Đ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 mà tôi đang gọi là trong /usr/binmộ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 độc giả trong tương lai): Bạn cần chạy tập lệnh của mình dưới dạng sudo. Nhập sudokhi gọi tập lệnh. Không sử dụng sudocho 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.


Đoạn thứ hai đã có câu trả lời cho vấn đề của tôi
M. Ahmad Zafar

@MuhammadAhmadZafar Vui mừng vì nó đã giúp!
Luc

4
Trên thực tế, việc sử dụng sudobên trong tập lệnh là hoàn toàn tốt với điều kiện bạn có các quyền thích hợp (được đặt sudoers) để chạy lệnh được đề cập mà không cần mật khẩu. Nó làm cho mọi thứ an toàn hơn một chút.
peterph

thực sự có thể sử dụng câu trả lời này được viết lại như một bước từng bước 'đây là cách bạn làm điều đó' chứ không phải là một cuộc đối thoại với các câu trả lời khác
Walrus the Cat

@WalrustheCat Điểm tốt. Đọc lại câu trả lời của tôi, tôi nghĩ rằng bản thân tôi có thể đã bối rối một chút. Ngay bây giờ, tôi không nhớ tình huống chính xác là gì nên tôi thực sự không thể viết tốt hơn. Nếu bạn tìm ra nó, có lẽ là sự kết hợp của một số câu trả lời, bằng mọi cách có thể gửi một câu trả lời mới!
Lục

1

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

super /path/to/your/script

Nếu bạn muốn chạy một số nhị phân thực thi (ví dụ mà bạn đã biên dịch thành ELF nhị phân từ một số mã nguồn C) -which là không một Script như là người chủ, bạn có thể xem xét làm cho nó setuid (và thực sự /bin/login, /usr/bin/sudo/bin/susupertất cả đều sử dụng kỹ thuật mà ). 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 thêm setreuid (2) ) (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 thật 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.

Chú ý rằng một kịch bản, hoặc bất kỳ công việc điều -ed, không thể setuid. Nhưng bạn có thể mã (trong C) một setuid-binary nhỏ bao bọc nó.


0

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, sudobạn nên thực hiện những thay đổi này trong một tệp riêng /etc/sudoers.d/thay vì chỉnh sửa sudoerstệp trực tiếp. 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Ờ nên cấp NOPASSWDcho ALLcác lệnh.

Thí dụ: sudo visudo -f /etc/sudoers.d/mynotriskycommand

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

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

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ỳ NOPASSWDlệnh cụ thể nào của người dùng xuất hiện TRƯỚC bất kỳ %groupyouarein ALL=(ALL) ALLlệnh nào trong đầu ra, bạn sẽ được nhắc nhập mật khẩu.

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 có 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ù đó là THÊM 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", vỏ 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 in AaBbCcvv hay ABCsau đó abcđể xác định tiền tố chữ cái "cuối cùng" tốt nhất sẽ sử dụng là gì.


0

Để 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 làm cho nó.


Mặc dù đó là một cách để thực hiện quy tắc sudo, nhưng nó không trả lời câu hỏi về lý do tại sao đặt cờ NOPASSWD trên quy tắc này vẫn dẫn đến một dấu nhắc mật khẩu. Xem câu trả lời được chấp nhận cho một ý tưởng tại sao nó xảy ra.
Jeff Schaller

0

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 option1nhưng không command option2sử dụng:

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

nhưng nếu cấu trúc là command option1 value1, nơi value1có 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 một kịch bản shell mà bạn gọi lệnh mà không có 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 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).
  3. Thêm ngoại lệ cho sudoers bằng visudo:

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

  4. 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 pmsetcó 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 sudoerstậ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 
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.