Làm thế nào để kiểm tra nếu tôi có quyền truy cập sudo?


104

Gần đây tôi đã gặp rắc rối vì điều này.

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.

Có cách nào để kiểm tra xem tôi có quyền truy cập sudo hay không?


Hỏi quản trị hệ thống của bạn?
mdpc

1
@mdpc: Có cách nào khác ngoài điều đó không?
Bruce

Bạn đã không đề cập nếu bạn có thể đạt được quyền truy cập root hay không.
mdpc

45
Đây phải là trường hợp đầu tiên nhìn thấy ai đó theo dõi "Sự cố này sẽ được báo cáo" .
slhck

Câu trả lời:


121

Chạy đi sudo -v. Nó thường được sử dụng để kéo dài thời gian chờ mật khẩu sudo của bạn, nhưng có thể được sử dụng để xác định xem bạn có bất kỳ sudođặc quyền nào không .

$ sudo -v
Sorry, user [username] may not run sudo on [hostname].

Đoạn trích trang Man:

Nếu được cung cấp tùy chọn -v (xác thực), sudo sẽ cập nhật dấu thời gian của người dùng, nhắc nhập mật khẩu của người dùng nếu cần. Điều này kéo dài thời gian chờ sudo thêm 5 phút nữa (hoặc bất cứ thời gian chờ nào được đặt thành sudoers) nhưng không chạy lệnh.

Nếu người dùng của bạn chỉ được phép chạy các lệnh cụ thể , lệnh này sẽ hoạt động, cho biết bạn được phép chạy một cái gì đó với các đặc quyền khác nhau. Mặc dù thông báo trông khác khi cố gắng thực thi lệnh mà bạn không được phép trong trường hợp này (và không có thư nào được gửi đến root ), nhưng vẫn có thể bạn sẽ gặp rắc rối nếu quản trị viên đọc /var/log/secure.

$ sudo ls
[sudo] password for [username]: 
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].

Để tìm hiểu những gì bạn được phép chạy với các đặc quyền khác nhau, bạn có thể sử dụng sudo -l. Lưu ý rằng lệnh này yêu cầu bạn nhập mật khẩu của bạn.


2
Cảm ơn. sudo -v làm việc cho tôi. Trang người đàn ông nói rằng tôi cũng có thể chạy sudo -l nhưng điều đó yêu cầu mật khẩu. Tại sao vậy?
Bruce

2
@Bruce Tôi đoán ở đây, nhưng nếu không thì ai đó (hoặc chương trình bạn chạy) có thể tìm ra chương trình nào có thể được thực thi (có thể không cần nhập mật khẩu) bởi người dùng hiện tại của bạn và cố gắng sử dụng thông tin đó một cách độc hại.
Daniel Beck

Bạn cho rằng nó có nghĩa là gì khi tôi lấy lại cái này : patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>? Tôi đã nhập mật khẩu của mình và không nhận được bất cứ điều gì về trái phép. Tôi biết tôi đã sudochạy thành công các lệnh khác, nhưng unable to resolve hostthông báo đó khiến tôi lo ngại một số thứ khác có thể gây cười trên máy chủ.
Patrick M

@PatrickM Có vẻ như một vấn đề với sudoerstập tin. Ở đó, bạn có thể chỉ định máy chủ nào được phép sử dụng để chạy một lệnh cụ thể (điều này hữu ích khi sử dụng cùng một sudoerstệp trên nhiều máy). Có thể tên máy chủ được chỉ định trong tệp đó không thể được giải quyết. Hãy thử kiểm tra nó bằng hostlệnh chẳng hạn.
Ale

Không hoạt động với tôi trên RHEL 6, sudo -vđã cho "xx không có trong tệp sudoers. Sự cố này sẽ được báo cáo."
79E09796

43

Điều này rất đơn giản. Chạy đi sudo -l. Điều này sẽ liệt kê bất kỳ đặc quyền sudo bạn có.


1
Có thể bị hạ thấp vì nó lặp lại những gì Daniel Beck đã nói gần hai năm trước.
G-Man

1
Hoặc giải thích những gì xảy ra, đó là một nhận xét, tốt nhất
Ramhound

2
@Jonathan: nếu bây giờ bạn sẽ viết script trong ub Ubuntu, hãy sudo -lhỏi mật khẩu nếu bạn có thể sudo hay không. sudo -vchỉ hỏi nếu bạn có thể, và "$(whoami)" != "root"sẽ không bao giờ hỏi bất cứ điều gì trong bất kỳ linux nào.
bksunday

@bksunday Bạn đúng rồi. Bây giờ tôi đã thử nghiệm trên Debian Jessy sạch và xác nhận kết quả của bạn. Nhận xét trước đây (đã xóa) của tôi có lẽ là kết quả của việc thử nghiệm trên một máy mà tôi có một số quyền riêng tư sudo.
Jonathan Ben-Avraham

@ G-Man nhưng câu trả lời đơn giản này đã giúp tôi nhiều hơn câu trả lời của Daniel có lẽ chính xác hơn, trong đó lệnh này là kết thúc đáng tiếc ...
Betlista

11

Đây là phiên bản thân thiện với kịch bản:

timeout 2 sudo id && echo Access granted || echo Access denied

vì nó sẽ không bị kẹt khi nhập mật khẩu nếu bạn không có sudoquyền truy cập.

Bạn cũng có thể đặt nó trong một biến như:

timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"

Lưu ý: Trên macOS, bạn cần cài đặt coreutils, vd brew install coreutils.


Bất kỳ lựa chọn thay thế nào cho nơi timeoutkhông có sẵn theo mặc định, ví dụ như trên OS X?
Harry

1
Bạn cần cài đặt coreutils, ví dụ brew install coreutils.
kenorb

2
Điều này không làm việc cho tôi trong một kịch bản. Vì lý do không giải thích được, kịch bản bị treo cho đến khi tôi giết nó.
beruic

7

Câu trả lời của Gerald Schade ở đây , vẫn có thể được cải thiện!

Sử dụng

prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
  # exit code of sudo-command is 0
  echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
  echo "has_sudo__needs_pass"
else
  echo "no_sudo"
fi

Đây là một ví dụ đầy đủ về việc sử dụng trong một tập lệnh :

#!/usr/bin/env bash

is_root () {
    return $(id -u)
}

has_sudo() {
    local prompt

    prompt=$(sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
    echo "has_sudo__pass_set"
    elif echo $prompt | grep -q '^sudo:'; then
    echo "has_sudo__needs_pass"
    else
    echo "no_sudo"
    fi
}

elevate_cmd () {
    local cmd=$@

    HAS_SUDO=$(has_sudo)

    case "$HAS_SUDO" in
    has_sudo__pass_set)
        sudo $cmd
        ;;
    has_sudo__needs_pass)
        echo "Please supply sudo password for the following command: sudo $cmd"
        sudo $cmd
        ;;
    *)
        echo "Please supply root password for the following command: su -c \"$cmd\""
        su -c "$cmd"
        ;;
    esac
}

if is_root; then
    echo "Error: need to call this script as a normal user, not as root!"
    exit 1
fi


elevate_cmd which adduser

2

Đối với tôi, ' sudo -v' và ' sudo -l' không hoạt động trong một tập lệnh vì đôi khi tương tác (hỏi tôi mật khẩu, như đã đề cập ở trên). ' sudo -n -l' cũng không hoạt động, nó đã cho mã thoát '1' mặc dù tôi có quyền sudo, vì mật khẩu bị thiếu. Nhưng mở rộng lệnh tới:

A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor

đã thành công cho tôi cho kịch bản. Biểu thức này đưa ra 0nếu người dùng hiện tại có thể gọi 'sudo' và 1nếu không.

Giải thích:
Tham số bổ sung -nđể sudongăn chặn tính tương tác.
Đầu ra $Acủa lệnh ' sudo -n -v 2>&1' có thể là:
- trống (trong trường hợp này, sudo có thể được gọi bởi người dùng hiện tại) hoặc:
- một lưu ý rằng người dùng hiện tại không được ủy quyền cho sudo hoặc:
- một văn bản câu hỏi cho mật khẩu (trong trường hợp này, người dùng được ủy quyền).
("Asswor" sẽ phù hợp với "mật khẩu" tiếng Anh cũng như "Passwort" của Đức).


2

Tôi đã có thứ hạng thấp để bình chọn và bình luận, nhưng tôi muốn nâng cao câu trả lời của Gerald Schade, vì tôi đã thấy rằng cách duy nhất trước đây và nghĩ rằng no1 khác biết điều đó - cho đến bây giờ: D

btw giải pháp của tôi:

[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]

(từ cuối năm 2015 mwhahaaa)


1
Đọc qua "Tại sao tôi cần 50 danh tiếng để bình luận" để đảm bảo bạn hiểu cách bạn có thể bắt đầu bình luận.
Pimp Juice IT

1

"Truy cập Sudo" có hương vị. Hai hương vị chính: Đầu tiên bạn hoặc một nhóm thành viên của bạn cần được thiết lập để truy cập sudo trong tệp / etc / sudoers.

Thứ hai, bạn cần biết mật khẩu của mình, hoặc bạn cần thực hiện một lệnh sudo gần đây. Gần đây, thời gian chờ đã hết hạn. (Sự thật thú vị: bạn có thể rút ngắn thời gian trong tệp sudoer của mình.)

Tôi thường muốn kiểm tra loại quyền truy cập thứ hai trong phần mở đầu của tập lệnh sẽ cần phải thực hiện một số bước. Khi kiểm tra này thất bại tôi có thể thông báo cho người dùng anh ta cần kích hoạt loại truy cập thứ 2 trước khi chạy tập lệnh.

bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled

-S bảo sudo đọc mật khẩu từ stdin. -P đặt dấu nhắc trống. -K xóa lần truy cập thứ hai.

Vì nó gửi stderr tới / dev / null, nên nó cũng sẽ kiểm tra xem người dùng có loại truy cập sudo đầu tiên hay không.


-4

Thực hiện theo các bước sau để xem tệp sudoers. Nếu bạn đang ở đó, bạn có sudo. Nếu không, bạn có thể thêm chính mình.

  1. su
  2. visudo
  3. Dưới cùng của tập tin, nhập your_username_here ALL=(ALL) ALL
  4. Lượt ESCvà gõ:wq
  5. Thể loại exit
  6. Chạy lại lệnh của bạn mà cần sudo
  7. Nhập mật khẩu của bạn (không phải mật khẩu của root)

11
OP "gặp rắc rối" khi chạy sudo, vì vậy anh ta có thể không phải quản trị viên hệ thống, thậm chí không phải là một trong những quản trị viên hệ thống ưu tú. Có lẽ anh ta chỉ là một người dùng nghĩ rằng anh ta có thể đã được cấp một số quyền hạn. Điều gì khiến bạn nghi ngờ rằng anh ấy có thể đi su?
Scott
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.