Nhắc mật khẩu sudo và đặc quyền nâng cao lập trình trong tập lệnh bash?


49

Tôi hiện đang làm việc với một tập lệnh bash cài đặt và thiết lập các chương trình khác nhau trên hệ thống Linux có sẵn (hiện tại là Ubuntu). Vì nó cài đặt các chương trình và sao chép một số tệp vào các thư mục khác nhau yêu cầu đặc quyền nâng cao, tôi đã thực hiện tiêu chuẩn "Tôi cần đặc quyền nâng cao" -và thoát.

Tuy nhiên, tôi muốn, nếu có thể, có thể nhắc người dùng nhập mật khẩu sudo của họ và tự động nâng cao các đặc quyền của tập lệnh nếu người dùng không chạy lệnh script bằng sudo (chẳng hạn như khởi chạy nó từ trình quản lý tệp GUI), mà không cần người dùng phải khởi động lại tập lệnh.

Vì điều này được thiết kế để chạy trên các bản cài đặt Linux, nên mọi tùy chọn sửa đổi hệ thống sẽ không hoạt động cho mục đích của tôi. Tất cả các tùy chọn cần phải được chứa trong chính kịch bản.

Đây có phải là có thể trong Bash? Nếu vậy, cách tốt nhất (an toàn, nhưng ngắn gọn) để làm điều này là gì?



@MichaelMrozek - Ah, niềm vui của việc có rất nhiều trang web thích hợp trong khi cố gắng giảm thiểu sự phân mảnh. Và bạn biết đấy, liên kết bạn đưa ra chưa bao giờ xuất hiện cho tôi khi tìm kiếm Google.
Shauna


@jww bạn có nhận ra rằng gần như tất cả các liên kết đó đã được hỏi khoảng 4 năm sau liên kết này, phải không?
Shauna

1
@Shauna - Tôi đoán bây giờ bạn đã giải quyết được vấn đề. Các liên kết là dành cho du khách trong tương lai.

Câu trả lời:


64

Tôi chạy sudotrực tiếp từ kịch bản:

if [ $EUID != 0 ]; then
    sudo "$0" "$@"
    exit $?
fi

16

Tôi đề nghị:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done

Những gì hiện if [[ -t 1 ]];séc?
Shauna

À, được rồi Tôi đoán nó có liên quan đến terminal vs GUI, nhưng không chắc câu lệnh if đang kiểm tra là gì.
Shauna

Thật tuyệt vời, cảm ơn!
Fire-Dragon-DoL

16

Thêm vào đây là dòng đầu tiên của tập lệnh:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

Thay đổi sudothành gksuhoặc gksudonếu bạn thích một dấu nhắc đồ họa.


3
Lưu ý rằng "$*"sẽ hợp nhất tất cả các đối số vào một ( /path/to/script one two threesẽ cho kết quả $1one two three), và $*không có dấu ngoặc kép sẽ mess lên khoảng trống trong lập luận. "$@"hoạt động đúng
Michael Mrozek

@MichaelMrozek À, đúng rồi. Đó là người mà tôi đang tìm kiếm, Đã sửa
Kevin

Có cách nào để làm điều này trên Debian, nơi dường như không có lệnh sudo?
wrongusername

@wrongusername cài đặt sudo, nó tốt hơn nhiều so với sử dụng su. Nhưng nếu bạn thực sự muốn, có lẽexec su -c "$0" "$@"
Kevin

2

kịch bản ví dụ tôi không ngại chia sẻ ::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK


[ "$UID" -eq 0 ] || exec sudo "$0" "$@"- Trông giống như một lớp lót thực sự hiệu quả! Đẹp!
Groovenectar

Sẽ có ý nghĩa khi sử dụng UID hiệu quả ở đây $EUDI, hay luôn luôn là kết quả tương tự? Ví dụ:[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
Groovenectar 17/12/18
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.