Mục đích của món ăn thật sự của người Hồi giáo trong bash giá trị nếu sudo đúng; sau đó"


20

Tôi đã hack cùng tập lệnh bash này để kiểm tra xem người dùng có các đặc quyền siêu người dùng hay không và nếu họ không yêu cầu họ. Cuối cùng, tôi đang cố gắng đảo ngược câu lệnh 'if' thứ hai để tôi có thể xóa hai dòng sau (echo "password ok" và dòng còn lại ở dòng sau)

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

Có phải mục đích của "true" trên dòng thứ tư chỉ là một tuyên bố null?

Tôi cần phải đảo ngược bài kiểm tra trên dòng thứ tư, làm thế nào để tôi làm như vậy? Đây là những gì tôi đã thử:

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

2
Nếu bạn định tải xuống câu hỏi, xin vui lòng bạn có thể giải thích những gì tôi có thể làm để cải thiện câu hỏi? Đây không phải là trang web tràn đúng?
Matt Parkins

4
Không chắc chắn các downvote đến từ đâu; bạn đang cố gắng phủ nhận tuyên bố hoặc vô hiệu hóa tuyên bố? Bạn nói rằng bạn muốn loại bỏ cả âm / thật và "khác", vậy mục tiêu cuối cùng của bạn là gì?
Jeff Schaller


1
@ ctrl-alt-delor theo liên kết đó, có vẻ như tất cả những gì tôi cần là đặt dấu chấm than trước sudo và sau đó tôi có thể loại bỏ cả tiếng vang và tiếng khác, và bây giờ tôi đã thử nó, cảm ơn.
Matt Parkins

2
Khi vượt qua, có lẽ bạn nên chuyển hướng thông báo lỗi sang luồng lỗi:echo "Aborting script" >&2
Toby Speight

Câu trả lời:


38

truetrong bash không phải là một từ khóa, nó là một chương trình thoát ngay lập tức với mã thoát thành công. Tương tự như vậy, falselà một chương trình thoát với mã thoát không thành công.

Bạn có thể thử điều này bằng cách chạy cả hai chương trình từ thiết bị đầu cuối của bạn, sau đó đọc $?biến chứa mã thoát của chương trình cuối cùng;

true
echo $? # 0
false
echo $? #1

if sudo truekhông tương đương với if sudo == true. if sudo trueđang chạy truechương trình bằng cách sử dụng sudovà kiểm tra mã thoát.

Vì thế:

if sudo false; thenđang chạy chương trình falsenhư sudo. Sự trở lại sẽ luôn luôn là sai.

if sudo true == falsesẽ chạy chương trình truevới các đối số ==falsesử dụng sudo. Điều này rõ ràng không muốn bạn dự định.

if [!(sudo true)] là cú pháp không hợp lệ.

Những gì bạn có thể đang tìm kiếm là

if ! sudo true;

12
Như một sự điều chỉnh hơi pedantic đến câu đầu tiên: trong bash , truefalselà "dựng sẵn", lệnh giải thích trực tiếp bằng vỏ; trong các hệ thống giống như Unix nói chung , chúng cũng tồn tại dưới dạng các chương trình độc lập trên hệ thống tệp. Sự khác biệt không quan trọng lắm ở đây, nhưng theo tôi biết, sudo truesẽ chạy chương trình độc lập, không phải là bash dựng sẵn.
IMSoP

31
Tái bút: tóm tắt yêu thích của tôi truefalselà những tiêu đề trên trang người đàn ông của họ: true - do nothing, successfullyfalse - do nothing, unsuccessfully
IMSoP

3
@IMSoP Thật sâu sắc.
Brainplot

2
Nếu truekhông tồn tại, mã trong câu hỏi cho thấy tại sao người ta có thể cần phải phát minh ra nó! Đây là một chương trình tối thiểu chỉ có thể thất bại nếu hệ thống mà nó thực sự hoạt động. Vì vậy, người ta có thể sử dụng nó để thiết lập nếu thông tin truy cập của một người là OK.
nigel222

2
Trong AT & T SYSV Unix, "true" là tập lệnh shell / bin / true, bao gồm một thông báo bản quyền lớn trong các bình luận ... và không có gì khác.
Lee Daniel Crocker

21

Tôi cảm thấy câu trả lời được chấp nhận không thực sự trả lời câu hỏi của bạn?

Các mục đích của việc này là để kiểm tra xem bạn có thể thực sự sudo.

Cách kiểm tra này được thực hiện thông qua truechương trình như được giải thích trong câu trả lời được chấp nhận.


1
Thực chất, cái này Thay thế có thể là để kiểm tra xem người dùng có thuộc nhóm sudoers hay không, nhưng chỉ cần chạy sudo truecũng đủ dễ dàng, mặc dù có một chút hack.
Sergiy Kolodyazhnyy

3
Lưu ý rằng điều này cũng cần sudophải được cài đặt, vì vậy các kiểm tra sẽ không hoàn toàn tương đương ... bạn có thể thuộc nhóm sudoers và vẫn không thể sudo. (Điều này đặc biệt có thể xuất hiện nếu bạn ví dụ viết kịch bản để thiết lập hình ảnh mới từ tarball rootfs tối thiểu, có thể không có sudo.)
Mehrdad

1
OP muốn bỏ học nếu bạn không thể sudo và thoát khỏi hai dòng thay vì có một dòng khác theo sau.
mckenzm

2
Và ngược lại, bạn cũng có thể tham sudogia nhóm sudoers nếu bạn (cá nhân hoặc là thành viên của một số nhóm khác ) được liệt kê trong /etc/sudoers. Nhưng thậm chí sudo truelà không thể sai lầm, vì sudoquyền truy cập chỉ có thể được cấp cho các lệnh cụ thể, do đó bạn có thể có thể sudo true, nhưng không thể sudo something_else, hoặc ngược lại. Không có cách nào để kiểm tra bằng cách thử chạy lệnh mà bạn thực sự muốn chạy sudo.
Dave Sherohman

2
Ngoài ra, bạn có thể ở trong sudoersnhóm và không thể sudosudoersnhóm không được liệt kê trong sudoerstệp. Một nhóm có bốn chữ cái sudotrong tên của nó không phải là một dấu hiệu hợp lệ cho dù người dùng trong nhóm đó có thể làm bất kỳ điều gì cụ thể hoặc bất cứ điều gì cả bằng cách sử dụng sudo.
jrw32982 hỗ trợ Monica

5

Như tôi thấy trong kịch bản này. Nó chỉ là kiểm tra nếu sudo được kích hoạt, đó là nó ..

đúng chỉ trả về đúng.

Vì vậy, trong trường hợp này nếu họ cần chạy bất kỳ lệnh nào với sudo thì nó sẽ kiểm tra lúc đầu, chỉ hỏi mật khẩu một lần.

Điều kiện hoạt động như thế này: nếu sudo đang thực thi đúng lệnh, nó sẽ trả về true cho điều kiện if, sau đó sudo được bật và người dùng nhập mật khẩu chính xác, nếu không bạn đã nhập sai mật khẩu hoặc sudo không được bật, tập lệnh không được tiếp tục.

Các lệnh khác không cần hỏi mật khẩu sudo, vì lần đầu tiên xác thực của bạn thành công (nhưng điều này phụ thuộc vào cấu hình sudo, vì vậy tập lệnh này phụ thuộc nhiều vào cấu hình môi trường)

'Mật khẩu echo ok' cũng chứng minh điều đó. kịch bản shell sẽ không hỏi mật khẩu nữa.


1
Các lệnh duy nhất chạy qua sudo có sudo truesudo -k. Cái sau rõ ràng không yêu cầu mật khẩu. Không có lệnh nào khác trong tập lệnh chạy qua sudo, vì vậy tất nhiên chúng sẽ không yêu cầu mật khẩu, bất kể lần đầu tiên xác thực có thành công hay không.
ilkkachu

Tôi đã viết: "Vì vậy, trong trường hợp này nếu họ cần chạy bất kỳ lệnh nào với sudo thì nó sẽ kiểm tra ngay từ đầu, chỉ hỏi mật khẩu một lần."
Luciano Andress Martini
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.