Thực hành tốt nhất về việc sử dụng sudo trong tập lệnh bash


11

Tôi có một tập lệnh bash dài và dài, trong đó một số lệnh cần được chạy dưới quyền root trong khi phần lớn các lệnh cần được chạy như người dùng thông thường trước sudo, vì nó sẽ gây rối quyền sở hữu tệp và như vậy.

Tôi đã đưa ra một số phương pháp, nhưng mỗi phương pháp đều có một số vấn đề

Phương pháp 1: Sử dụng sudo bên trong tệp

#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"

Điều này sẽ nhìn tốt, từ cách viết mã. sudođược viết trước một vài câu lệnh thực sự cần được chạy bằng root, nhưng nếu thời gian giữa mỗi sudocuộc gọi quá dài sudolại yêu cầu nhập mật khẩu. Ngoài ra, nếu lần thực hiện đầu tiên sudokhông thành công, ví dụ do mật khẩu không hợp lệ, phần còn lại của tập lệnh vẫn được thực thi.

Phương pháp 2: sử dụng sudo để gọi tệp và sau đó đổi lại người dùng ban đầu khi cần

#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"

Điều này cũng hút, bởi vì tôi cần phải thêm su username -cvào trước hầu hết các dòng. Cũng có thể tìm tên người dùng ban đầu sau khi sudocó thể, nhưng cồng kềnh.

Có cách nào tốt hơn?

Chỉnh sửa: Tôi chỉ đăng các kịch bản nhỏ, vô nghĩa ở đây để hiển thị những gì tôi đang nói về. Trong kịch bản thực tế tôi có một số dòng cần sudo (bắt đầu và dừng dịch vụ), một số dòng không quan trọng nếu có sudo và khá nhiều dòng thực sự cần phải chạy mà không có sudo.


4
Điều này rất hiếm khi cần thiết. Trong hầu hết các trường hợp, bạn chỉ cần chạy tập lệnh sudonếu nó cần phải có quyền nâng cao. Nhưng không có điểm nào để chuyển su username -csang chạy echo. Nói cách khác, âm thanh này giống như một [XY]. Bạn có thể chỉnh sửa và giải thích kịch bản của bạn sẽ thực sự làm gì và tại sao bạn cảm thấy cần phải chuyển đổi người dùng thường xuyên không?
terdon

1
@ElderGeek bạn đã dán liên kết sai? Điều đó thậm chí không có vẻ liên quan. Đây có lẽ là một bản sao của Làm thế nào để tôi chạy lệnh 'sudo' bên trong một tập lệnh? nhưng tôi hy vọng OP có thể giải thích thêm một chút.
terdon

@terdon Có vẻ như vậy. Dọn dẹp.
Anh Cả Geek

Đây chỉ là một kịch bản ví dụ. Tôi không muốn dán một tập lệnh 200+ vào đây. Tôi sẽ chỉnh sửa câu trả lời để biết thêm chi tiết.
Dakkaron

Bạn đã xem xét tùy chọn xác nhận, được mô tả trong man sudo? -v, --validate 'Cập nhật thông tin đăng nhập được lưu trong bộ nhớ cache của người dùng, xác thực người dùng nếu cần. Đối với plugin sudoers, điều này kéo dài thời gian chờ sudo thêm 15 phút theo mặc định, nhưng không chạy lệnh. Không phải tất cả các chính sách bảo mật đều hỗ trợ thông tin lưu trữ. ' (Nếu bạn chạy nó đủ thường xuyên, việc xác thực sudo không nên hết thời gian.)
sudodus

Câu trả lời:


5

Về phương pháp 2, việc sử dụng hàm dễ dàng hơn. Ví dụ:

#!/bin/bash

func(){
    echo "Username: $USER"
    echo "    EUID: $EUID"
}

export -f func

func
su "$SUDO_USER" -c 'func'

$SUDO_USERlà tên người dùng của sudoer. Bạn cũng có thể sử dụng $(logname)ở vị trí của nó.

Chạy trên máy của tôi:

$ sudo bash test.sh
[sudo] password for wja: 
Username: root
    EUID: 0
Username: wja
    EUID: 1000

2

Bằng cách đọc man sudoers, người ta thấy:

 PASSWD and NOPASSWD

   By default, sudo requires that a user authenticate him or herself
   before running a command.  This behavior can be modified via the
   NOPASSWD tag.  Like a Runas_Spec, the NOPASSWD tag sets a default for
   the commands that follow it in the Cmnd_Spec_List.  Conversely, the
   PASSWD tag can be used to reverse things.  For example:

   ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

   would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm
   as root on the machine rushmore without authenticating himself. 

Do đó, bạn có thể cho phép regularmáy chủ machine1thực thi command1command2root, không cần xác thực mật khẩu với:

reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2  

nhưng đọc từng man -k sudochi tiết


0

Có lẽ điều này có thể giúp:

chmod 775 yourcript.sh

Sau đó, bạn có thể sử dụng sudo bên trong tập lệnh (không có dấu nhắc mật khẩu) Và không thể sử dụng sudo cho các lệnh khác trong tập lệnh của bạn.


Tôi sợ rằng nó không hoạt động. chmod 775chỉ cho phép bạn thực thi tệp và không thay đổi người dùng đang thực thi tệp hoặc quyền của họ.
Dakkaron
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.