Nếu tôi sudo thực thi một tập lệnh Bash, tất cả các lệnh bên trong tập lệnh Bash cũng sẽ được thực thi như sudo chứ?


30

Tôi muốn viết một kịch bản hậu cài đặt tự động bằng Bash ( post-install.shví dụ, được gọi là ). Tập lệnh sẽ tự động thêm và cập nhật kho, cài đặt và cập nhật gói, chỉnh sửa tập tin cấu hình, v.v.

Bây giờ, nếu tôi thực thi tập lệnh này, chẳng hạn sudo post-install.sh, tôi sẽ chỉ được nhắc sudonhập mật khẩu một lần, hoặc tôi sẽ cần nhập sudomật khẩu cho mỗi lần gọi một lệnh bên trong tập lệnh, có cần sự sudocho phép không? Nói cách khác, các lệnh bên trong tập lệnh bash 'kế thừa' các quyền thực thi, để nói?

Và, nếu họ thực sự làm , vẫn có khả năng các sudoquyền sẽ hết thời gian (ví dụ, nếu một lệnh cụ thể mất đủ thời gian để vượt quá sudothời gian chờ)? Hoặc sudolối vào mật khẩu ban đầu sẽ kéo dài trong toàn bộ thời gian của toàn bộ tập lệnh?


4
Bạn có thể quan tâm để kiểm tra một số công cụ được thiết kế đặc biệt cho nhiệm vụ này. 3 cái phổ biến là: Con rối, đầu bếp và ancible.
spuder

@spuder và để quản lý cấu hình cấp doanh nghiệp và bảo mật ở quy mô lớn hơn, bạn có thể sử dụng CFEngine 3. (Không dành cho người yếu tim, cũng không phải cho các lệnh một lần.)
Wildcard

Câu trả lời:


38

Q # 1: Tôi sẽ chỉ được nhắc nhập mật khẩu sudo một lần, hoặc tôi sẽ cần nhập mật khẩu sudo trên mỗi lần gọi lệnh trong tập lệnh, có cần quyền sudo không?

Có, một lần, trong suốt thời gian chạy tập lệnh của bạn.

LƯU Ý: Khi bạn cung cấp thông tin đăng nhập sudo, xác thực thường tốt trong 5 phút trong vỏ mà bạn đã nhập mật khẩu. Ngoài ra, bất kỳ tiến trình con nào được thực thi từ trình bao này hoặc bất kỳ tập lệnh nào chạy trong trình bao (trường hợp của bạn) cũng sẽ chạy ở mức cao.

Q # 2: vẫn có khả năng các quyền sudo sẽ hết thời gian (ví dụ: nếu một lệnh cụ thể mất đủ thời gian để vượt quá thời gian chờ sudo)? Hoặc lối vào mật khẩu sudo ban đầu sẽ kéo dài trong toàn bộ thời gian của toàn bộ tập lệnh?

Không, họ sẽ không hết thời gian trong kịch bản. Chỉ khi bạn tương tác gõ chúng trong vỏ, nơi thông tin đăng nhập được cung cấp. Mỗi lần sudođược thực thi trong shell này, thời gian chờ được đặt lại. Nhưng trong trường hợp của bạn, thông tin đăng nhập của họ sẽ duy trì miễn là tập lệnh đang thực thi và chạy các lệnh từ bên trong nó.

đoạn trích từ trang sudo man

Giới hạn này là chính sách cụ thể; thời gian chờ mật khẩu mặc định cho chính sách bảo mật sudoers là 5 phút.


1
Câu trả lời cho Q1 là "Không, bạn sẽ không được nhắc lại."
dannysauer

@dannysauer - đọc lại Q của anh ấy. Tôi đang nói Có để được nhắc nhập mật khẩu chỉ một lần!
slm

Câu hỏi cho biết "đó là a hay b" và chỉ nói "có" không làm rõ nếu đó là "có, một" hoặc "có, b". Chỉ cố gắng làm rõ mọi thứ cho độc giả tương lai. : D
dannysauer

@dannysauer - xem cập nhật.
slm

1
Câu hỏi mới này sẽ là: stackoverflow.com/questions/3522341/ . sudo -u $(logname) <command>nên làm việc.
Gauthier

17

bashvà tất cả các tiến trình con của nó sẽ chạy với quyền siêu người dùng. Vì vậy, bạn sẽ không cần nhập lại mật khẩu cho các lệnh trong tập lệnh bash của mình.

Thời sudogian chờ chỉ áp dụng cho (sau) gọi riêng sudo. Nó sẽ không ảnh hưởng đến quá trình bash đang chạy của bạn hoặc bất kỳ hậu duệ nào của nó.


3

Những câu trả lời có lẽ đều đúng. Tuy nhiên, đây không phải là cách thường được sử dụng (theo như tôi biết) để tạo các tập lệnh bash yêu cầu sudoquyền. Nói chung, ở đầu tập lệnh, bạn cho rằng nó chưa được chạy với sudoquyền và thay vào đó hãy sudo -vtự gọi (điều này sẽ nhắc người dùng nhập mật khẩu của họ) để 'thiết lập' một sudo'phiên'. Bạn có thể echomột số văn bản giải thích trước lời nhắc hoặc ghi đè sudolời nhắc của chính nó bằng công -ptắc, để cho người dùng biết bạn cần sudotruy cập cho một số lệnh.

Sau đó, trong tập lệnh của bạn, bạn sẽ ổn khi gọi sudocác lệnh yêu cầu nó (và chỉ những lệnh yêu cầu nó) mà không cần thêm mật khẩu. Nếu bạn nghĩ rằng một nhóm lệnh nhất định chạy cùng nhau trong tập lệnh của bạn (bất kể việc sử dụng chúng là gì sudo) sẽ vượt quá thời gian chờ sudo, bạn có thể gọi sudo -vở giữa để đưa ra một loại phiên 'duy trì sudo' '.

Nếu sudo'phiên' xảy ra hết hạn trong tập lệnh, người dùng sẽ chỉ cần được hỏi mật khẩu của họ vào lần tới khi bạn đưa ra lệnh sudo trong tập lệnh.


1
Giả sử rằng một trong các bước của tập lệnh đang xây dựng một nhân linux hoàn toàn mới, có thể mất hai giờ. Giữ cho phiên sống còn có thể là một thách thức, làm thế nào bạn đối phó với điều đó?
Gauthier

Bạn không thể. Nhưng lần tới khi bạn gọi sudo -vnó sẽ hỏi lại người dùng mật khẩu của họ. Không phải là vấn đề tồi tệ nhất theo ý kiến ​​của tôi. Có lẽ là hữu ích, làm cho người dùng nhận thức được cơ chế có thể có ích.
alexrussell

Nghịch đảo của điều này là yêu cầu người dùng gọi tập lệnh với sudo theo các câu trả lời khác, và sau đó sudo -u $SUDO_USERlàm cho tất cả các lệnh không yêu cầu root không chạy được nâng cao. Đáng buồn thay, nó thêm nhiều mã hơn, nhưng là cách đáng tin cậy duy nhất để thực hiện những thứ gốc trong một quy trình dài.
dragon788

Tôi đoán tôi nên làm rõ, một cách khác để làm điều này là gọi sudo một lần ở đầu tập lệnh để đưa tệp tạm thời vào /etc/sudoers.dsử dụng visudo -c -f /tmp/tempsudoersđể đảm bảo tệp hợp lệ trước khi sao chép tệp vào vị trí, sau đó xóa tệp đó sau khi hoàn tất (sử dụng bẫy khi thoát / lỗi để đảm bảo việc leo thang không thể bị lạm dụng). Việc triển khai an toàn và bảo mật nhất sẽ chỉ cho phép người dùng của bạn chạy các lệnh cụ thể trong tập lệnh của bạn với các đối số cụ thể mà không cần mật khẩu bằng NOPASSWDcách lưu trữ từng lệnh / đối số vào một mảng để tạo tệp.
dragon788

Hơi muộn khi quay lại @Gauthier ở đây nhưng có vẻ như tôi đã sai khi tôi nói rằng bạn không thể giữ một sudophiên còn sống nếu một nhiệm vụ nhất định mất nhiều thời gian hơn thời gian chờ. Tôi đã bắt gặp kỹ thuật này vào một ngày khác trong repo dotfiles của Mathias Bynens: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell
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.