Làm thế nào để tôi sudo một lệnh trong một kịch bản mà không được yêu cầu nhập mật khẩu?


107

Tôi muốn bật hệ thống của tôi tự động mỗi ngày. Vì vậy, tôi sử dụng mã dưới đây trong tập lệnh Python của mình, nhưng sudohỏi tôi mật khẩu mỗi lần:

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

Làm thế nào tôi có thể chạy tập lệnh này mà không sudoyêu cầu mật khẩu mỗi lần?


4
Bạn nên xem hướng dẫn sử dụng bo mạch chủ hoặc BIOS để xem nó có hỗ trợ hành vi này không. Tôi biết nó né tránh câu hỏi! =] Nhưng nó có thể là một giải pháp đầy đủ.
Alex Hirzel

Câu trả lời:


149

Xin lưu ý: Bất kỳ phương pháp nào liên quan đến việc đặt mật khẩu đăng nhập của bạn ở dạng văn bản đơn giản, trong một lệnh hoặc trong một tệp, đều không an toàn và KHÔNG nên được sử dụng!

Cách chính xác để thực hiện để thiết lập sudosao cho chỉ một lệnh cụ thể bạn cần, nghĩa là echo date... > rtc..., được phép chạy mà KHÔNG cần mật khẩu.

Bước 1. Tạo một kịch bản shell với lệnh đó

  • Mở lên gedit(hoặc trình soạn thảo yêu thích của bạn) và tạo tập lệnh, vdpydatertc.sh
  • Chỉ chèn dòng này và lưu nó vào, ví dụ thư mục chính của bạn:
    ngày lặp lại \ '+% s \' -d \ '+ 24 giờ \'> / sys / class / rtc / rtc0 / wakealarm
  • Thoát khỏi trình soạn thảo và từ thiết bị đầu cuối, làm cho tập lệnh có thể thực thi được thay đổi quyền sở hữu của nó thành root , nếu không, một người dùng khác có quyền truy cập vào hệ thống của bạn có thể chỉnh sửa nó và thực hiện bất kỳ lệnh nào họ muốn làm root mà không cần mật khẩu của bạn:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

Bước 2. Thiết lập sudo để cho phép pydatertc.shthực thi mà không yêu cầu mật khẩu

  • Nhập sudo visudovào thiết bị đầu cuối để mở tệp sudo allow ( sudoers)
  • Khoảng dòng 25, bạn sẽ thấy dòng này: %sudo ALL=(ALL:ALL) ALL
  • Bên dưới dòng đó , chèn dòng sau, usernametên người dùng của bạn ở đâu :
    tên người dùng ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Thoát trình chỉnh sửa ( Ctrl+ Xnếu nano )

Bước 3. Sửa đổi kịch bản python của bạn để gọi pydatertc.sh

  • Thay đổi dòng thành:
    os.system ('sudo /home/username/pydatertc.sh')

Bây giờ tập lệnh của bạn sẽ chạy mà không yêu cầu mật khẩu không ảnh hưởng đến bảo mật tài khoản, dữ liệu hoặc hệ thống của bạn!


Chỉ thay thế cho wakealarm(không sử dụng chung!):

Chỉ trong trường hợp cụ thể này , vì /sys/class/rtc/rtc0/wakealarmtệp chỉ điều khiển cảnh báo đánh thức cho hệ thống và nếu không thì vô hại, một cách khác để tránh mật khẩu là để sở hữu tệp đó chown(nếu bạn là người dùng duy nhất cài đặt báo thức) hoặc làm cho nó có thể viết được trên thế giới chmod +666; trong trường hợp đó, chỉ cần xóa sudocuộc gọi Python của bạn, giữ sh -c "...."nguyên.


1
Tuyệt vời, đây là cách chính xác để làm điều đó.
roadmr

1
Đó là một câu trả lời chi tiết, hữu ích và chính xác làm thế nào nó nên được thực hiện.
ArtOfCode

@RobertRosati, cảm ơn rất nhiều về chỉnh sửa được đề xuất của bạn - Tôi không nên quên điều đó ngay từ đầu!
ish

1
@ m-ric Bạn đã đọc lệnh trên các dòng này chưa? "Nếu không, một người dùng khác có quyền truy cập vào hệ thống của bạn có thể chỉnh sửa nó và thực hiện bất kỳ lệnh nào họ muốn làm root mà không cần mật khẩu của bạn"
Tobias Kienzler

2
Tôi nhận ra câu trả lời này đã cũ - nhưng vẫn còn một vấn đề ở đây: nếu tệp được đặt trong / home / tên người dùng , thì hệ thống có thể bị xâm phạm nếu thư mục đó có thể ghi bởi người dùng độc hại (hoặc đăng nhập không phải root thỏa hiệp) . Họ có thể xóa hoặc đổi tên tệp, đặt một tập lệnh khác vào vị trí của nó và chạy tập lệnh đó thông qua sudo- mà không cần mật khẩu. Do đó, an toàn hơn nhiều khi đặt tập lệnh vào một thư mục mà chỉ root mới có thể thay đổi, ví dụ: / usr / sbin hoặc / root . Nếu không, đó là LGTM.
NVRAM

30

Cảnh báo!

Đặt mật khẩu đăng nhập của bạn trong văn bản đơn giản, trong một lệnh hoặc tệp, cực kỳ không an toàn và có thể làm tổn hại dữ liệu riêng tư và hệ thống của bạn. Rất khuyến khích không bao giờ làm điều này ngay cả khi bạn nghĩ rằng hệ thống của bạn là "cá nhân" hoặc ở "vị trí an toàn"!

Nếu tập lệnh chỉ dành cho sử dụng cá nhân và bạn đã đặt nó ở nơi an toàn và bạn không sợ tài khoản của mình bị đánh cắp và như vậy, thì đây là một giải pháp đơn giản:

echo LOGINPASSWD | sudo -S COMMAND HERE

trong đó LOGINPASSWD là mật khẩu đăng nhập của bạn (ví dụ: iloveponies) và THÔNG TIN TẠI ĐÂY là lệnh của bạn xuất hiện sau sudo, như sh -c "echo da .. vv


13
@Viswa, Xin lưu ý rằng, điều này rất nguy hiểm khi tiết lộ mật khẩu bằng văn bản thuần túy. Bạn được khuyến cáo, không nên làm điều đó
Anwar

3
-1 Nếu đây có vẻ là một ý tưởng hay, bạn sẽ tốt hơn nếu chỉ đặt mật khẩu trên tài khoản root của mình và sử dụng giải pháp của z7sg; điều đó thật dễ dàng và không tạo ra vấn đề bảo mật rất nguy hiểm này.
Bryce

4
Hừ! Tôi đã có 6 upvote và 4 downvote cho câu trả lời của mình :) Nhưng tại sao mọi người, tôi không rõ 'Sử dụng cá nhân', 'nơi an toàn', v.v.? Không có vấn đề bảo mật trừ khi bạn cung cấp tệp này và bạn có máy chủ ssh đang chạy! Bạn thấy vấn đề bảo mật ở đâu với điều kiện là tập lệnh dành cho sử dụng cá nhân và ở nơi an toàn?
hytromo

5
Bị hạ thấp, đây là Đường đến mặt tối và không cần thiết với phương thức sudo.
Floyd

4
Ok, chỉ cần cho tôi biết, ngay cả khi tin tặc đã đăng nhập như một người dùng đơn giản vào tài khoản của bạn, làm thế nào anh ta sẽ tìm thấy tập lệnh với mật khẩu của bạn trong / usr / share / help / lv / ub Ubuntu-help ??
hytromo

21

Nếu bạn không quan tâm đến tập lệnh chạy vào một thời điểm cụ thể vào giờ (hoặc trong ngày), hãy đặt nó vào thư mục gốc của root ( /root) và chạy tập lệnh từ hệ thống crontab ( /etc/crontab) dưới dạng root. Sau đó, bạn sẽ không phải thỏa hiệp bảo mật của bạn.

Xem https://help.ubfox.com/community/CronHowto để biết cách thêm tập lệnh vào crontab.


4
Bạn có thể muốn sử dụng anacronnếu đó là máy tính để bàn / máy tính xách tay không chạy 24x7
balki

Đây là một câu trả lời hữu ích, ví dụ nếu bạn đang viết kịch bản để kiểm tra các bản cập nhật, hãy làm gì đó với thông tin đó và gửi email cho quản trị viên về các cập nhật cần thiết. Cá nhân, nhiều tập lệnh của tôi được sử dụng cho tự động hóa máy chủ, vì vậy chỉ cần sử dụng sudo crontab -e là những gì tôi có xu hướng làm. +1
Rab

11

Một tính năng hay khác có liên quan của sudo chưa được đề cập trong các câu trả lời xuất sắc ở trên là biến 'timestamp_timeout'. Đây là một biến sudo mà bạn có thể tăng để lưu khi nhập mật khẩu tương tác.

Ví dụ, trong / etc / sudoers (hoặc một trong các tệp được bao gồm từ nó), bạn có thể sửa đổi mặc định:

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

Mô tả đầy đủ từ 'man sudoers':

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

Tất nhiên, điều này không thể giúp trong trường hợp cụ thể chạy lệnh từ cron. Nhưng nó là một điều tốt để nhận thức được.


0
export MY_SUDO_PASS="user_password_here"

Để kiểm tra xem nó có hoạt động không:

echo $MY_SUDO_PASS
> user_password_here

Để chạy "sudo apt-get update" và chấp nhận mật khẩu từ các biến môi trường mà chúng ta đã tạo trước đây:

echo $MY_SUDO_PASS | sudo -S apt-get update

Chạy từ python (ví dụ thay đổi quyền sở hữu thư mục đệ quy thành username_here):

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $ MY_SUDO_PASS nhận mật khẩu -S chuyển sang bắt nó và chuyển mật khẩu cho sudo


Tôi không chắc điều này bổ sung vào các câu trả lời hiện có mà hầu hết các hỗ trợ BIOS hiện tại đều báo thức ...
Elder Geek
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.