Bash Scripting: Yêu cầu script được chạy dưới quyền root (hoặc với sudo)


26

Tôi đang cố gắng viết một tập lệnh bash (trong Ubuntu) để sao lưu thư mục bằng tar.

Làm thế nào tôi có thể kiểm tra tập lệnh để nó chỉ có thể được chạy dưới quyền root (hoặc với sudo)?

Ví dụ: nếu người dùng chạy tập lệnh, cần nói rằng tập lệnh này phải được chạy với các đặc quyền sudo và sau đó thoát. Nếu tập lệnh được thực thi với quyền root, nó sẽ tiếp tục qua kiểm tra.

Tôi biết rằng phải có một giải pháp dễ dàng, tôi chỉ không thể tìm thấy nó bằng cách googling.

Câu trả lời:


37

Để kéo uid hiệu quả, sử dụng lệnh này:

id -u

Nếu kết quả là '0' thì tập lệnh đang chạy dưới dạng root hoặc sử dụng sudo. Bạn có thể chạy kiểm tra bằng cách làm một cái gì đó như:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

5
Tôi muốn giới thiệu đủ điều kiện đường dẫn đến id (ví dụ: / usr / bin / id). Mặt khác, người dùng lệch lạc có thể viết tập lệnh / nhị phân của riêng họ luôn trả về 0 và sau đó đặt nó vào vị trí tồn tại trước đó trong đường dẫn của người dùng đang thực thi.
ktower

Đã đồng ý. Sửa chữa với một chỉnh sửa.
Scott Pack

6
Bất cứ ai 'ranh ma' khi cố gắng chạy tập lệnh sẽ không bị chặn bởi bạn sử dụng đường dẫn đầy đủ đến id.
theotherreceive

Tôi đồng ý với điều đó ... đó là một kịch bản bash. Việc đủ điều kiện bin 'id' sẽ không ngăn chặn bất kỳ ai có ý định nghiêm túc về việc kiểm tra. Tốt hơn là để nó không đủ tiêu chuẩn cho tính di động.
Chris

1
Điều này không giải quyết yêu cầu "sudo".
GregB

17

Tôi giả sử bạn biết rằng bằng cách thay đổi quyền sở hữu thành root

chown root:root file

và đặt quyền thành 700

chmod 700 file

bạn sẽ hoàn thành điều tương tự - không có gợi ý để chạy như sudo.

Nhưng tôi sẽ đăng câu trả lời này cho đầy đủ.


3
Đây là một giải pháp phù hợp hơn câu trả lời được chấp nhận. - 0,02 đô la của tôi
Chris

Lưu ý bên: kiểm tra tập lệnh vào git trở nên khó khăn hơn. Để khắc phục,sudo git add <file>
Chaim Eliyah

2

Mục tiêu của bạn ở đây là gì, để thông báo cho người dùng rằng họ nên chạy tập lệnh với quyền root hoặc như một biện pháp phòng ngừa bảo mật nào đó?

Nếu bạn chỉ muốn thông báo cho người dùng hơn bất kỳ đề xuất uid nào là tốt, nhưng chúng hữu ích như lốp xe trên ngựa để phòng ngừa an ninh - không có gì ngăn người dùng sao chép tập lệnh, loại bỏ câu lệnh if, và chạy nó nào.

Nếu đây là một vấn đề bảo mật thì tập lệnh nên được đặt thành 700, thuộc sở hữu của root: root, để nó không thể đọc hoặc thực thi được bởi bất kỳ người dùng nào khác.


Hoặc, đó có thể là tập lệnh yêu cầu quyền truy cập vào các tệp hoặc các lệnh chỉ có thể truy cập vào root để thực hiện công việc của nó, như trong trường hợp của tôi
chrisbunney

2

Bạn có thể sử dụng lệnh whoami là tốt.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

Trên thực tế, uid 0 là tài khoản người dùng đặc biệt với đầy đủ đặc quyền. "root" đơn giản là nhãn / tên phổ biến nhất được ánh xạ tới UID đó. Nó không phải là 'root' và kẻ tấn công có thể cố gắng khai thác này.
0xSheepdog

2

Biến bash $EUIDhiển thị UID hiệu quả mà tập lệnh đang chạy, nếu bạn muốn đảm bảo tập lệnh chạy dưới quyền root, hãy kiểm tra wether $EUIDcó chứa giá trị 0 hay không:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Aborting."
    exit 2
fi

Điều này tốt hơn giải pháp với /usr/bin/id(đối với tập lệnh bash!) Vì nó không yêu cầu lệnh bên ngoài.


Thay vì chỉ thoát, có thể nhắc người dùng đăng nhập sudo bằng cách thay thế echodòng bằng sudo "$0" "$@"và thay thế exit 2bằng exit $?.
schumacher574

0

Một cách đơn giản để làm cho tập lệnh chỉ có thể chạy được bằng root là bắt đầu tập lệnh với dòng:
#!/bin/su root


-1

"#! / Bin / su root" cho phép người dùng ở chế độ siêu người dùng chạy tập lệnh mà không cần sử dụng mật khẩu gốc. Nếu bạn muốn siêu người dùng chạy tập lệnh với kết quả là root, thì điều này thực hiện điều đó.

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.