Thực thi sudo mà không có mật khẩu?


292

Lấy cảm hứng từ câu hỏi này ....

Tôi là người duy nhất sử dụng hệ thống của tôi với 12.04.
Mỗi khi tôi ra sudolệnh; hệ thống yêu cầu mật khẩu người dùng (tốt theo cách riêng của nó).
Tuy nhiên tôi đã suy nghĩ; mà không kích hoạt tài khoản root ; Làm thế nào tôi có thể thực thi các lệnh sudo sẽ không yêu cầu mật khẩu người dùng để xác thực.

LƯU Ý: Tôi muốn thực thi lệnh sudo mà không cần xác thực qua mật khẩu; chỉ khi chúng được thực hiện thông qua thiết bị đầu cuối.
Tôi không muốn xóa lớp bảo mật bổ sung này khỏi các chức năng khác trong khi sử dụng 'Trung tâm phần mềm Ubuntu' hoặc thực thi tập lệnh bash bằng cách kéo-thả tập tin Something.sh vào thiết bị đầu cuối.


2
Vì vậy, bạn chỉ muốn được yêu cầu nhập mật khẩu trong thiết bị đầu cuối và cho những thứ khác không, hoặc cách khác arround?! theo cả hai cách, tôi nghĩ rằng đó là một vi phạm bảo mật cao
Dr_Bunsen

Tôi muốn hệ thống đó không thể chỉ hỏi mật khẩu khi ở trong thiết bị đầu cuối ... vì bất kỳ mục đích nào khác, hệ thống phải hỏi mật khẩu. Yêu cầu này chỉ là tạm thời và được sử dụng trong khi định cấu hình n cài đặt máy chủ mới .. trong quá trình cài đặt máy chủ mới, thực sự phải mất hàng giờ để cấu hình bằng các lệnh sudo .. phát hành mật khẩu cứ sau 15 phút. là đau đầu. Tôi không muốn sử dụng tài khoản root.
Bhavesh Diwan

Bạn cần phải đọc các cuộc thảo luận trong: askubfox.com/questions/135428/ trên
david6

1
Để chắc chắn bạn có thể kéo dài thời gian chờ. Ngoài ra, nếu bạn thường xuyên thực hiện các thiết lập máy chủ mới, bạn nên nghĩ về việc tự động hóa quy trình. Bạn không được trả tiền để đánh máy, bạn được trả tiền để giải quyết vấn đề và để hoàn thành công việc.
MauganRa

Câu trả lời:


82

sudo -i là cách tốt nhất nếu bạn không muốn nhập mật khẩu cứ sau 10 phút trong khi thực hiện sửa đổi trong hệ thống của mình (hoặc các hệ thống khác) và bạn không muốn sửa đổi bất kỳ tệp hệ thống nào.

Nó sẽ chuyển bạn sang root bằng sudomật khẩu người dùng, khi bạn đóng bàn điều khiển hoặc gõ exitbạn trở lại với người dùng bình thường.


2
Điều này có đúng không khi tôi chỉ nhập mật khẩu một lần ... và cho đến khi tôi không thoát; thời tiết 5 giờ. hoặc 15 .... hệ thống sẽ không yêu cầu xác thực bằng mật khẩu khi bất kỳ lệnh sudo nào được ban hành.
Bhavesh Diwan

2
@ Z9iT cho đến khi bạn nhập exithoặc cho đến khi bạn đóng cửa sổ trình mô phỏng đầu cuối.
Bruno Pereira

2
Cảm ơn .. Đã chấp nhận câu trả lời này vì nó phục vụ mục đích phát lệnh sudo mà không cần xác thực mật khẩu trong n-giờ cho đến khi chúng tôi không thoát .. Không sửa đổi tệp hệ thống là một lợi thế.
Bhavesh Diwan

3
Điều này không thực sự trả lời câu hỏi, bởi vì bạn vẫn cần nhập mật khẩu để trở thành root tại thời điểm đó.
Adam F

2
Không phải nếu bạn đang chạy một máy ảo trong một môi trường bảo mật và bạn chỉ muốn điều đó làm ngay lập tức và bạn không muốn xử lý mật khẩu. Câu trả lời này không trả lời câu hỏi, trong khi đó là thông tin hữu ích. Tôi đồng ý với Adam F
Jonathan Komar

573

Bạn có thể cấu hình sudođể không bao giờ yêu cầu mật khẩu của bạn.

Mở một cửa sổ Terminal và gõ:

sudo visudo

Trong phần dưới cùng của tệp, thêm dòng sau:

$USER ALL=(ALL) NOPASSWD: ALL

Trong trường hợp $USERlà tên người dùng của bạn trên hệ thống của bạn. Lưu và đóng tệp sudoers (nếu bạn chưa thay đổi trình chỉnh sửa thiết bị đầu cuối mặc định của mình (bạn sẽ biết nếu có), nhấn ctl + x để thoát nanovà nó sẽ nhắc bạn lưu).

Kể từ Ubuntu 19.04, tệp bây giờ trông giống như

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

YOUR_USERNAME_HERE ALL=(ALL) NOPASSWD: ALL

Sau này, bạn có thể nhập sudo <whatever you want>vào cửa sổ Terminal mà không được nhắc nhập mật khẩu.

Điều này chỉ áp dụng, để sử dụng sudolệnh trong thiết bị đầu cuối. Bạn vẫn sẽ được nhắc nhập mật khẩu nếu bạn (ví dụ) cố gắng cài đặt gói từ trung tâm phần mềm

nhắc nhở mật khẩu


15
Bạn nên sử dụng sudo visudothay vì chỉnh sửa trực tiếp. Ngoài ra, việc thay đổi quyền của các sudoers có thể tự khóa. Khi chỉnh sửa vim, sử dụng :wq!để ghi vào các tệp chỉ đọc và thoát khỏi trình chỉnh sửa . Theo cách đó, quyền 644 là không cần thiết.
Lekensteyn

8
Đây là một rủi ro bảo mật nghiêm trọng, bất kỳ ai chiếm đoạt bất kỳ tài khoản nào có quyền sudo đều có thể kiểm soát toàn bộ hệ thống và khóa mọi quyền truy cập vào máy tính này, nghiêm túc không được khuyến nghị.
Bruno Pereira

6
@ wil93 bạn đang thiếu điểm: một tập lệnh gọi sudo install crapwaresẽ không yêu cầu mật khẩu trong trường hợp này và có thể làm rối tung mọi thứ bạn có, và bạn không cần phải ở bên cạnh một máy để phân phối tập lệnh lần trước tôi đã kiểm tra. .. Đây chỉ là một ví dụ.
Bruno Pereira

12
@BrunoPereira Nếu bạn có kế hoạch chạy các tập lệnh không đáng tin cậy thì đó là rủi ro bảo mật (ngay cả khi sudo yêu cầu mật khẩu, một tập lệnh độc hại luôn có thể làm rm -rf ~hỏng khá nhiều thứ). Nhìn chung, tôi sẽ không gọi «rủi ro bảo mật nghiêm trọng» việc xóa mật khẩu nhanh chóng khỏi sudo.
w9393

5
Đồng ý với @ wil93. Khi chạy một tập lệnh không đáng tin cậy, nhập mật khẩu không có nhiều cơ hội để hủy quá trình, trong khi tôi nghi ngờ rằng nó vô dụng đối với hầu hết mọi người. Vấn đề là bạn biết kịch bản từ đâu và nó làm gì.
Chad

36

Root sudo hết thời gian là cách dễ nhất và an toàn nhất để làm điều này. Tôi sẽ đưa ra tất cả các ví dụ nhưng được cảnh báo rằng sẽ rất rủi ro nếu bạn làm điều này mặc dù cách này an toàn hơn nhiều:

sudo visudo

Thao tác này sẽ mở trình soạn thảo và trỏ nó vào tệp sudoers - Ubuntu mặc định là nano, các hệ thống khác sử dụng Vi. Bây giờ bạn là một siêu người dùng chỉnh sửa một trong những tệp quan trọng nhất trên hệ thống của bạn. Không áp lực!

(Vi hướng dẫn cụ thể được ghi chú với (vi!) . Bỏ qua những hướng dẫn này nếu bạn đang sử dụng nano.)

Sử dụng các phím mũi tên để di chuyển đến cuối Defaultsdòng.

(vi!) nhấn phím A (viết hoa "a") để di chuyển ở cuối dòng hiện tại và vào chế độ chỉnh sửa (nối sau ký tự cuối cùng trên dòng).

Bây giờ gõ:

,timestamp_timeout=X

Trong đó X là thời gian hết hạn tính bằng phút. Nếu bạn chỉ định 0, bạn sẽ luôn được hỏi mật khẩu. Nếu bạn chỉ định một giá trị âm, thời gian chờ sẽ không bao giờ hết hạn. Ví dụ Defaults env_reset,timestamp_timeout=5.

(vi!) nhấn Escape để trở về chế độ lệnh. Bây giờ, nếu bạn hài lòng với việc chỉnh sửa của mình, hãy nhập :w Enterđể ghi tệp và :q Enterthoát vi. Nếu bạn mắc lỗi, có lẽ cách dễ nhất là làm lại từ đầu, thoát ra mà không lưu (nhấn Escapeđể vào chế độ lệnh) và sau đó gõ: q! Enter.

Nhấn Ctrl+ X, sau đó Y, Enterđể lưu tệp của bạn và thoát nano.

Bạn có thể muốn đọc các trang hướng dẫn sudoers và vi để biết thêm thông tin.

man sudoers
man vi

Đặt lại giá trị thời gian chờ bằng cách sử dụng:

sudo -k

Các hướng dẫn này là để xóa lời nhắc cho mật khẩu khi sử dụng lệnh sudo. Lệnh sudo vẫn sẽ cần được sử dụng để truy cập root.

Chỉnh sửa tập tin sudoers

Mở một cửa sổ Terminal. Nhập vào sudo visudo. Thêm dòng sau vào END của tệp (nếu không ở cuối, nó có thể bị vô hiệu hóa bởi các mục sau):

<username> ALL=NOPASSWD: ALL

Thay thế <username>bằng tên người dùng của bạn (không có <>). Điều này giả định rằng Ubuntu đã tạo ra một nhóm có cùng tên với tên người dùng của bạn, đây là điển hình. Bạn có thể luân phiên sử dụng người dùng nhóm hoặc bất kỳ nhóm nào khác mà bạn tham gia. Chỉ cần đảm bảo rằng bạn thuộc nhóm đó. Điều này có thể được kiểm tra bằng cách đi tới Hệ thống -> Quản trị -> Người dùng và Nhóm.

Thí dụ:

michael ALL=NOPASSWD: ALL

Nhập ^ X ( Ctrl+ X) để thoát. Điều này sẽ nhắc cho một tùy chọn để lưu tệp, nhập Y để lưu.

Đăng xuất, và sau đó đăng nhập lại. Điều này bây giờ sẽ cho phép bạn chạy lệnh sudo mà không được nhắc nhập mật khẩu.

Tài khoản root

Kích hoạt tài khoản root

Kích hoạt tài khoản root hiếm khi cần thiết. Hầu hết mọi thứ bạn cần làm là quản trị viên của một hệ thống Ubuntu đều có thể được thực hiện thông qua sudo hoặc gksudo. Nếu bạn thực sự cần đăng nhập root liên tục, cách thay thế tốt nhất là mô phỏng shell đăng nhập Root bằng lệnh sau:

sudo -i

Tuy nhiên, nếu bạn phải kích hoạt thông tin đăng nhập gốc, bạn có thể làm như thế này:

sudo passwd root

Vô hiệu hóa lại tài khoản root của bạn

Nếu vì lý do nào đó bạn đã kích hoạt tài khoản root của mình và muốn vô hiệu hóa lại, hãy sử dụng lệnh sau trong thiết bị đầu cuối:

sudo passwd -dl root

Sudo toàn hệ thống

root$ echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Đăng xuất, và sau đó quay trở lại.

Đặt lại thời gian chờ sudo

Bạn có thể đảm bảo sudo yêu cầu mật khẩu vào lần tới bằng cách chạy:

sudo -k

Tôi đã đăng bài này trước khi tôi thêm, vì một cách rộng rãi hệ thống để làm điều này và những người khác đọc ở đây:
user209328

Đây là một câu trả lời muộn, nhưng là toàn diện nhất về các tùy chọn mà nó mang lại cho bạn.
jenming

1
Hmm, trên Ubuntu 18.04 MATE, điều này hoạt động hoàn hảo, trong khi thực hiện tương tự trên Ubuntu 18.04 Gnome khiến tôi nhăn với vấn đề "tên người dùng không có trong tệp sudoers ...". Bây giờ, đây là lý do tại sao rất nhiều pple chỉ ghét linux - vì nó hiếm khi là "nguyên nhân": D Chỉ trong trường hợp U chạy vào cùng ... Đây là cách bạn khắc phục vấn đề: tecmint.com/
Peter

Biến môi trường EDITOR có thể đặt trình sudo env EDITOR=/bin/nano visudochỉnh sửa được sử dụng ... ví dụ: để chỉnh sửa đáng tin cậy sudoerstrong nano. (cũng có thể sử dụng các lựa chọn thay thế để cài đặt trình chỉnh sửa)
Gert van den Berg

29

Cách ưa thích để cấp quyền cá nhân (hoặc nhóm) sẽ là thêm tệp trong /etc/sudoers.d

Điều này tách biệt các thay đổi cục bộ khỏi chính sách mặc định và tiết kiệm thời gian trong trường hợp tệp sudoers phân phối thay đổi.

Để làm cho người dùng hiện đang đăng nhập aa sudoer và sudokhông nhắc họ nhập mật khẩu, hãy sử dụng

echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/$USER

điều này sẽ tạo một tệp có tên /etc/sudoers.d/$USER(nơi $USERlà tên người dùng của người dùng mà bạn đã đăng nhập như khi bạn chạy lệnh đó), làm rõ người dùng nào được cấp quyền.

Nếu bạn muốn làm điều đó cho một người dùng khác, chỉ cần thay thế cả hai trường hợp $USERbằng một số tên người dùng khác trong lệnh trên.

echo "otheruser ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/otheruser

Tương tự, một tệp có thể được sử dụng để quản lý nhiều lệnh:

echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers.d/local

Xem /etc/sudoers.d/READMEman sudoersđể biết thêm thông tin.


lệnh echo thất bại, mặc dù tôi đã root. nhưng, tôi đã thêm tệp và chỉnh sửa trực tiếp và nó đã hoạt động trên Ubuntu mới nhất (trong khi thêm người dùng vào sudoers thì không!)
scape

1
Cách đúng là làm điều đó với teelệnh.
woto

1
Đây là một cách tốt hơn để hoạt động : sudo sh -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(logname)', tiếp theo làsudo chmod 440 /etc/sudoers.d/$(logname)
paradroid 14/11/18

Trong sudo ... >filechuyển hướng shell được thực thi trong shell ban đầu, vì vậy nó chỉ có thể hoạt động trong shell root.
Konstantin Pelepelin

phương pháp phát bóng, không có sự cố cho phép:echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/username
Carson Ip

7

Một lớp lót đẹp để loại bỏ lời nhắc sudo cho người dùng hiện tại

sudo bash -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" | (EDITOR="tee -a" visudo)'

2
Tôi nghĩ bạn chỉ có thể làm : echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo env EDITOR="tee -a" visudo, chỉ visudocần sudosau tất cả (và thậm chí envsẽ không cần trong cấu hình mặc định, IIRC).
muru

Theo tôi, có quá nhiều lỗi có thể xảy ra (tất cả là lỗi người dùng), theo ý kiến ​​rất khiêm tốn của tôi, để chỉnh sửa trực tiếp tệp sudoer ( sudo visudo), trong khi kiểm tra kết quả (với trình chỉnh sửa vẫn mở), đối với những người dùng mới có thể muốn dùng thử "một lớp" này.
michael

Cảm ơn vì bạn đã phản hồi! Tôi đã nhanh chóng cố gắng để script-ify loại bỏ dấu nhắc mật khẩu sudo trong các máy ảo thử nghiệm dễ bay hơi của tôi. Vui lòng đề xuất cải tiến :)
Eric Landry

Bạn vẫn cần phải sudo chmod 440 /etc/sudoers.d/$(logname)sửa quyền truy cập tệp như đã nêu trong README trong thư mục đó.
paradroid

6

Tất nhiên những gì bạn muốn làm không được khuyến khích. Sau một thời gian, mặc dù việc nhập sudotrở nên tự động đến mức độ hữu dụng của nó giảm đi.

Một cách tiếp cận khác là để nguyên tệp sudoers của bạn và trong khi thực hiện một thao tác phức tạp nào đó cho hàng trăm máy chủ của bạn, hãy nhập sudo bash. Điều đó sẽ cung cấp cho bạn một shell sẽ được xác thực là root cho đến khi bạn thoát nó.


12
sudo -shoặc sudo -icó lẽ là cả hai ý tưởng tốt hơn sudo bash, bởi vì chúng đảm bảo môi trường lành mạnh và mọi thứ.
Darael

2
"Sane và mọi thứ" thường không nằm trong lĩnh vực "ý tưởng tốt hơn", ai đó có thể đưa ra lời giải thích kỹ thuật về lý do tại sao sudo -s hoặc sudo -i tốt hơn sudo bash không? (Chỉnh sửa: Đây là một câu hỏi có liên quan Askubfox.com/questions/376199/ mẹo )
Nuzzolilo

2
một số sudolệnh (đặc biệt là suy nghĩ sudo pip ...) yêu cầu sudo -H(đặt HOME) để lệnh chạy đúng. Trong các trường hợp khác, sudo -E(bảo vệ env) có thể được yêu cầu. Chạy sudo bashcó thể sẽ hoạt động trong hầu hết các trường hợp, nhưng không phải tất cả, và khi không, nó sẽ không rõ ràng tại sao.
michael

1
sudo su là cách truyền thống để chuyển đổi vai trò và bắt đầu hành động một quản trị viên hệ thống.
1656671

3

Từ Super User có một câu trả lời hay:

Sử dụng khóa -S đọc mật khẩu từ STDIN:

echo <password> | sudo -S <command>

Thay thế <password>bằng mật khẩu của bạn.


2
Điều này không được đề xuất, vì mật khẩu vẫn còn trong Cleartype trong tệp lịch sử shell. Áp dụng bất kỳ giải pháp khác thay thế.
HappyCactus

1
@HappyCactus bạn có thể đặt một lần không gian phía trước echođể nó không xuất hiện trong lịch sử không?
WinEunuuchs2Unix

Có, điều này sẽ tránh lộ mật khẩu Cleartext vào tệp lịch sử. Nhưng bạn có luôn nhớ thêm nó không? :-)
HappyCactus

@HappyCactus Tôi có xu hướng thêm không gian hàng đầu một cách tình cờ và sau đó cảm thấy khó chịu khi lịch sử không thể nhớ lại :) Dù sao, Siêu người dùng có 129 lượt nâng cấp vì vậy tôi nghĩ rằng đó là một câu trả lời tốt để rời khỏi đây. Mọi người sẽ đọc các bình luận của chúng tôi và biết về các bước rủi ro và ác cảm rủi ro.
WinEunuuchs2Unix

Tôi hoàn toàn đồng ý. Chúc một ngày tốt lành!
HappyCactus


2

Đây là giải pháp một dòng cũng thay đổi quyền truy cập tệp như đã nêu trong /etc/sudoer.d/README:

sudo sh -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(logname)' & sudo chmod 440 /etc/sudoers.d/$(logname)

0
  • Mở rộng trên ý tưởng @upteryx.

  • Đây là cách tôi đã triển khai người dùng không root, không mật khẩu trong Hình ảnh Docker phù du để sử dụng trong đường ống CICD:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
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.