題 如何檢查我是否有sudo訪問權限?


我最近因此而陷入困境。

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

有沒有辦法檢查我是否有sudo訪問權限?


83
2018-02-18 19:36


起源


問你的系統管理員? - mdpc
@mdpc:還有另外一種方法嗎? - Bruce
您沒有提到是否可以獲得root訪問權限。 - mdpc
這必須是第一個例子 看到有人跟進“此事件將被報告”。 - slhck


答案:


sudo -v。它通常用於擴展您的sudo密碼超時,但可用於確定您是否有任何密碼超時 sudo 特權。

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

手冊頁摘錄:

如果給出-v(驗證)選項,sudo將更新用戶的時間戳,並在必要時提示輸入用戶密碼。這會將sudo超時延長5分鐘(或者sudoers中設置的超時),但不會運行命令。

如果您的用戶只允許運行 具體 命令,此命令將起作用,表示您可以運行 某物 擁有不同的特權。雖然在嘗試執行命令時消息看起來不同,但在這種情況下你不允許這樣做(和 沒有郵件發送到root),如果管理員閱讀,你仍然可能遇到麻煩 /var/log/secure

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

要找出來 什麼 你被允許以不同的權限運行,你可以使用 sudo -l。請注意,此命令要求您輸入密碼。


102
2018-02-18 19:51



謝謝。 sudo -v適合我。手冊頁說我也可以運行sudo -l但是要求輸入密碼。這是為什麼? - Bruce
@Bruce我在這裡猜測,但是否則有人(或你運行的程序)可以找出當前用戶可以執行的程序(可能沒有輸入密碼)並嘗試惡意使用該信息。 - Daniel Beck♦
當我得到這個時,你認為這意味著什麼: patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>?我輸入了密碼,沒有得到任何未經授權的信息。我知道我有 sudo 從成功運行其他命令,但那 unable to resolve host 消息讓我擔心其他東西可能在主機上很時髦。 - Patrick M
@PatrickM看起來像是一個問題 sudoers 文件。在那裡,您可以指定用戶被授權運行特定命令的主機(在使用相同的命令時這很有用) sudoers 多台機器上的文件)。可能無法解析該文件中指定的主機名。嘗試用它來檢查它 host 例如命令。 - Ale
在RHEL 6上對我不起作用, sudo -v 給出了“xx不在sudoers文件中。這個事件將被報導。” - 79E09796


這很簡單。跑 sudo -l。這將列出您擁有的任何sudo權限。


38
2017-12-17 22:55



也許是投票,因為它重複了近兩年前丹尼爾貝克所說的話。 - G-Man
或解釋發生了什麼,這是評論,充其量 - Ramhound
@Jonathan:如果你現在在ubuntu上編寫腳本, sudo -l 如果你可以sudo或不sudo請求密碼。 sudo -v 只問你是否可以,並且 "$(whoami)" != "root" 在任何linux中都不會有任何問題。 - bksunday
@bksunday你是對的。我現在在乾淨的Debian Jessy上測試並確認了你的結果。我以前的(現在刪除)評論可能是我在一台機器上進行測試的結果 sudo PRIVS。 - Jonathan Ben-Avraham
@ G-Man但是這個簡單的答案對我的幫助不僅僅是丹尼爾的答案更精確,這個命令最終是不幸的...... - Betlista


這是腳本友好的版本:

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

因為如果你沒有密碼,它就不會卡在密碼輸入上 sudo 訪問。

您也可以在變量中設置它:

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

注意:在macOS上,您需要安裝 coreutils,例如 brew install coreutils


6
2018-06-14 00:49



任何替代方案 timeout 默認情況下不可用,例如在OS X? - Harry
你需要安裝 coreutils,例如 brew install coreutils。 - kenorb
這在腳本中對我不起作用。由於無法解釋的原因,腳本會掛起,直到我將其刪除。 - beruic


為了我, 'sudo -v'和'sudo -l'沒有在腳本中工作,因為有時是交互式的(要求我輸入密碼,如上所述)。 “sudo -n -l'確實也沒有用,它給出了退出代碼'1'雖然我有sudo權限,因為缺少密碼。 但是將命令擴展到:

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

我的腳本成功了。 這個表達式給出了 0 如果當前用戶可以調用'sudo'和 1 如果不。

說明:
附加參數 -n 至 sudo 防止互動。
輸出 $A 命令'sudo -n -v 2>&1' 也許:
  - empty(在這種情況下,sudo可以由當前用戶調用),或者:
  - 注意當前用戶未獲得sudo授權,或者:
  - 密碼的問題文本(在這種情況下,用戶被授權)。
(“asswor”適用於英語“密碼”以及德語“密碼”)。


1
2018-02-28 02:27





我的投票和評論排名很低,但我想贊成Gerald Schade的答案,因為我發現以前唯一的方法,並認為沒有其他人知道它 - 直到現在:D

順便問一下我的解決方案:

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

(2015年底mwhahaaa)


1
2017-10-01 22:31



通讀 “為什麼我需要50點評論才能發表評論” 確保您了解如何開始評論。 - Pimp Juice IT


Gerald Schade的回答 這裡,仍然可以改進!

使用

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

這是一個 完整的腳本用法示例

#!/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

1
2017-12-30 18:57



第一個腳本幫了我,謝謝! - JRichardsz


“Sudo access”有各種口味。兩個主要的風格:首先,您需要在/ etc / sudoers文件中為sudo訪問設置您或您的成員組。

其次,你需要知道你的密碼,或者你最近需要做一個sudo命令。最近,超時尚未到期。 (有趣的事實:你可以在你的sudoer文件中花很長時間。)

我經常想在腳本的prolog中測試第二種訪問,這需要sudo一些步驟。當此檢查失敗時,我可以建議用戶在運行腳本之前啟用第二種訪問權限。

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告訴sudo從stdin讀取密碼。 -p設置一個空提示符。 -K清除第二次訪問。

由於它將stderr發送到/ dev / null,它還將檢查用戶是否具有第一種類型的sudo訪問權限。


1
2017-08-30 17:58





跟隨 這些 查看sudoers文件的步驟。如果你在那裡,你有sudo。如果沒有,您可以添加自己。

  1. su
  2. visudo
  3. 在文件的底部,輸入 your_username_here ALL=(ALL) ALL
  4. 擊中 退出 和類型 :wq
  5. 類型 exit
  6. 重新運行所需的命令 sudo
  7. 輸入您的密碼(不是root用戶的密碼)

-3
2018-02-18 19:41



OP因運行“陷入困境” sudo所以他可能不是 該 系統管理員,甚至也不是精英系統管理員之一。他可能只是一個認為自己可能獲得一些有限權力的用戶。是什麼讓你懷疑他能走了 su? - Scott