최근에이 문제로 어려움을 겪었습니다.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
sudo 액세스 권한이 있는지 확인하는 방법이 있습니까?
최근에이 문제로 어려움을 겪었습니다.
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
sudo 액세스 권한이 있는지 확인하는 방법이 있습니까?
답변:
를 실행하십시오 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
. 이 명령을 사용하려면 비밀번호를 입력해야합니다.
patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>
합니까? 비밀번호를 입력했는데 승인되지 않은 정보가 없습니다. 내가 알고 sudo
성공적으로 실행되는 다른 명령에서,하지만 unable to resolve host
메시지는 나에게 호스트에 펑키 수 있습니다 다른 우려 뭔가가있다.
sudoers
파일에 문제가있는 것 같습니다 . 여기에서 사용자가 특정 명령을 실행할 권한이있는 호스트를 지정할 수 있습니다 ( sudoers
여러 시스템 에서 동일한 파일을 사용할 때 유용함 ). 해당 파일에 지정된 호스트 이름을 확인할 수 없습니다. host
예를 들어 명령으로 확인하십시오 .
sudo -v
"xx는 sudoers 파일에 없습니다.이 사건은보고 될 것입니다."
이것은 매우 간단합니다. 를 실행하십시오 sudo -l
. 가지고있는 모든 sudo 권한이 표시됩니다.
sudo -l
하면 sudo가 가능한지 암호를 묻습니다. sudo -v
당신이 할 수있는 경우에만 "$(whoami)" != "root"
묻고 어떤 리눅스에서도 아무것도 묻지 않을 것입니다.
sudo
priv 가있는 컴퓨터에서 테스트 한 결과 일 것입니다 .
다음은 스크립트 친화적 인 버전입니다.
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
.
timeout
OS X에서 기본적으로 사용할 수없는 위치 에 대한 대안 이 있습니까?
coreutils
예를 들어 설치해야합니다 brew install coreutils
.
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
나를 위해 ' 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"에도 적합합니다).-n
sudo
$A
sudo -n -v 2>&1
나는 투표하고 의견을 제시 할 순위가 낮았지만, 이전의 유일한 방법을 찾았고 지금까지 아무도 알고 있지 않다고 생각한 Gerald Schade의 답변을지지하고 싶었습니다.
내 솔루션 btw :
[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]
(2015 년 말부터)
"스도 액세스"는 풍미가 있습니다. 두 가지 주요 특징 : 먼저 / 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 액세스 권한이 있는지 확인합니다.
sudoers 파일을 보려면 다음 단계를 따르십시오 . 당신이 거기 있다면, sudo가 있습니다. 그렇지 않은 경우 자신을 추가 할 수 있습니다.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
sudo
그래서 그는 아마되지 않습니다 시스템 관리자 나 엘리트 시스템 관리자의 경우에도 하나. 그는 아마도 제한된 권한을 부여 받았다고 생각한 사용자 일 것입니다. 그가 갈 수 있다고 생각하는 이유는 무엇입니까 ? su