sudo 액세스 권한이 있는지 확인하는 방법


100

최근에이 문제로 어려움을 겪었습니다.

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

sudo 액세스 권한이 있는지 확인하는 방법이 있습니까?


시스템 관리자에게 문의하십시오?
mdpc

1
@ mdpc : 그 외에 다른 방법이 있습니까?
Bruce

루트 액세스가 가능한지 언급하지 않았습니다.
mdpc

답변:


117

를 실행하십시오 sudo -v. 일반적으로 sudo 비밀번호 제한 시간을 연장하는 데 사용되지만 sudo권한 이 있는지 여부를 판별하는 데 사용할 수 있습니다 .

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

맨 페이지 발췌 :

-v (유효성) 옵션이 제공되면 sudo는 사용자의 타임 스탬프를 업데이트하여 필요한 경우 사용자의 비밀번호를 묻습니다. 이렇게하면 추가 5 분 동안 (또는 sudoers에서 시간 초과가 설정된 모든 시간) sudo 시간 초과가 연장되지만 명령은 실행되지 않습니다.

사용자가 특정 명령 만 실행할 수있는 경우이 명령이 작동 하여 다른 권한으로 무언가 를 실행할 수 있음을 나타냅니다 . 이 경우 명령을 실행할 때 메시지가 다르게 보이지만 (이 경우 메일이 루트로 전송되지 않음 ) 관리자가을 읽을 경우 문제가 발생할 수 /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. 이 명령을 사용하려면 비밀번호를 입력해야합니다.


2
감사. sudo -v가 나를 위해 일합니다. 매뉴얼 페이지에 sudo -l도 실행할 수 있지만 비밀번호를 묻는 메시지가 표시됩니다. 왜 그런가요?
Bruce

2
@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

42

이것은 매우 간단합니다. 를 실행하십시오 sudo -l. 가지고있는 모든 sudo 권한이 표시됩니다.


1
거의 2 년 전 Daniel Beck의 말을 반복하기 때문에 공감 될 수 있습니다.
G-Man

1
아니면 기껏 주석,의, 일에 대해 설명
Ramhound

2
@Jonathan : ubuntu rigt에서 스크립트를 작성 sudo -l하면 sudo가 가능한지 암호를 묻습니다. sudo -v당신이 할 수있는 경우에만 "$(whoami)" != "root"묻고 어떤 리눅스에서도 아무것도 묻지 않을 것입니다.
bksunday

@bksunday 당신이 맞습니다. 나는 깨끗한 데비안 Jessy에서 지금 테스트하고 결과를 확인했습니다. 내 이전 (지금 삭제 된) 의견은 아마도 sudopriv 가있는 컴퓨터에서 테스트 한 결과 일 것입니다 .
조나단 벤-아브라함

@ G-남자 만이 간단한 대답은 더이 명령 ...을 매우 unfortunatelly 종료 아마 더 정확한 다니엘의 대답보다 나에게 도움이
Betlista

11

다음은 스크립트 친화적 인 버전입니다.

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

당신이 sudo액세스 할 수없는 경우 암호 입력에 붙어 있지 않기 때문에 .

다음과 같은 변수로 설정할 수도 있습니다.

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

참고 : macOS에서는을 설치해야합니다 ( coreutils예 :) brew install coreutils.


timeoutOS X에서 기본적으로 사용할 수없는 위치 에 대한 대안 이 있습니까?
Harry

1
coreutils예를 들어 설치해야합니다 brew install coreutils.
kenorb 2016 년

2
이것은 스크립트에서 작동하지 않습니다. 알 수없는 이유로 스크립트는 내가 죽일 때까지 중단됩니다.
beruic

6

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

2

나를 위해 ' sudo -v'와 ' sudo -l'는 대화 형이기 때문에 스크립트에서 작동하지 않았습니다 (위에서 언급 한 것처럼 암호를 요구합니다). ' sudo -n -l'도 작동하지 않았습니다. 비밀번호가 없어서 sudo 권한이 있지만 종료 코드 '1'을주었습니다. 그러나 명령을 확장하여

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

대본에 성공했습니다. 이 표현식은 0현재 사용자가 'sudo'를 호출 할 수 1있는지 여부를 나타냅니다.

설명 : 대화 식성 을 방지 하기
위한 추가 매개 변수 . 명령 ' ' 의 출력 은 다음과 같습니다 .-비어 있거나 (이 경우 sudo는 현재 사용자가 호출 할 수 있음) --현재 사용자에게 sudo에 대한 권한이 부여되지 않았 음을 나타 냅니다. 비밀번호 (이 경우 사용자에게 권한이 부여됨) ( "asswor"는 영어 "password"뿐만 아니라 독일어 "Passwort"에도 적합합니다).-nsudo
$Asudo -n -v 2>&1




2

나는 투표하고 의견을 제시 할 순위가 낮았지만, 이전의 유일한 방법을 찾았고 지금까지 아무도 알고 있지 않다고 생각한 Gerald Schade의 답변을지지하고 싶었습니다.

내 솔루션 btw :

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

(2015 년 말부터)


1
댓글 을 작성하는 방법을 이해하려면 "댓글을 달려면 왜 50 개의 평판이 필요한가?"를 읽으십시오 .
Pimp Juice IT

1

"스도 액세스"는 풍미가 있습니다. 두 가지 주요 특징 : 먼저 / etc / sudoers 파일에서 sudo 액세스를 위해 사용자 또는 구성원 그룹을 설정해야합니다.

두 번째로 비밀번호를 알고 있거나 최근에 sudo 명령을 수행해야합니다. 최근에 시간 초과가 만료되지 않을 정도로 충분합니다. (재미있는 사실 : 당신은 sudoer의 파일에서 시간을 매우 길게 만들 수 있습니다.)

나는 종종 몇 단계를 거쳐야 할 스크립트의 프롤로그에서 두 번째 종류의 액세스를 테스트하려고합니다. 이 검사가 실패하면 사용자에게 스크립트를 실행하기 전에 두 번째 종류의 액세스를 활성화해야한다고 알릴 수 있습니다.

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 액세스 권한이 있는지 확인합니다.


-3

sudoers 파일을 보려면 다음 단계를 따르십시오 . 당신이 거기 있다면, sudo가 있습니다. 그렇지 않은 경우 자신을 추가 할 수 있습니다.

  1. su
  2. visudo
  3. 파일의 맨 아래에 입력 your_username_here ALL=(ALL) ALL
  4. 적중 ESC과 유형:wq
  5. 유형 exit
  6. 필요한 명령을 다시 실행하십시오. sudo
  7. 비밀번호를 입력하십시오 (루트 비밀번호가 아님).

10
영업 이익은 실행하는 "문제에있어" sudo그래서 그는 아마되지 않습니다 시스템 관리자 나 엘리트 시스템 관리자의 경우에도 하나. 그는 아마도 제한된 권한을 부여 받았다고 생각한 사용자 일 것입니다. 그가 갈 수 있다고 생각하는 이유는 무엇입니까 ? su
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.