사용자가 사용할 수 있는지 확인하고 싶지만 sudo
-아니요bash 쉘 스크립팅을 위해 비밀번호를 작성해야 합니다. 나는 몇 가지 조사를 했고 다음과 같은 사실을 알아냈습니다.
sudoers
in을 통해 구성되지 않아 사용할 수 없는 사용자의 경우 sudo
실행sudo -n <command>
언제나터미널에 메시지를 인쇄합니다 sudo: a password is required
. 그리고 사용자가 사용할 수 있는 경우 sudo
-- sudo
세션에서 실행되지 않거나 sudo
의정지시키다만료됨 - sudo: a password is required
메시지가 다시 인쇄됩니다.
또한 올바른 솔루션을 사용하십시오(그러나 다른 경우에는).
$(sudo -n uptime 2>&1 | grep "load" | wc -l)
sudo
승인되지 않은 사용자의 경우언제나0을 반환합니다. 사용자가 사용할 수 sudo
있고sudo
정지시키다여전히 유효함 - 1을 반환하고, 그렇지 않으면 0을 반환합니다.
질문: 그래서 이 방법을 사용하는 것은아니요명령을 통해 사용자가 사용 가능한지 실제로 알 수 있습니다 sudo
. 이 솔루션은 다음을 아는 경우에만 가능합니다 sudo
.정지시키다아직도 유효합니까?
지금까지의 sudo -v
해결책은 거의 다음과 같습니다.
sudoers
명령으로 반환된 구성이 없는 사용자 의 경우
Sorry, user <username> may not run sudo on <hostname>.
사용자가 사용할 수 있는 경우 비밀번호가 필요합니다 sudo
. sudo -v
그것이 유효한 경우 sudo
또는정지시키다여전히 유효합니다.비어 있는. 따라서 여기까지는 뚜렷한 차이점과 해결책이 없습니다.하지만Bash Shell
일을 하고 있어서 사용해야 하기 때문에명령 대체
is_user_sudo=$(sudo -v) # if is empty sudo can be used otherwise not
질문비밀번호 프롬프트 부분을 피하고 싶습니다. 이것이 해결책이 될 것입니다.
sudo -k
또는 비밀번호를 묻지 않는 것과 같은 다른 매개변수(물론 다른 작업을 수행함)나 목표를 달성하기 위한 다른 명령이 있는 경우 .
표적: 오직루트가 아닌사용 가능한 사용자는 sudo
일부 bash 스크립트를 실행할 수 있습니다. 따라서 스크립트 내에서 유형을 식별하는 명령이 필요합니다.루트가 아닌사용자 - 따라서 non-root
사용할 수 없는 사용자 에게 통보 sudo
하고 스크립트 실행을 중지해야 합니다.
예를 들어:
# an if statement about 'id -u' not equals a 0
can_use_sudo=$(<command> whoami) # so the non-root user
# is able to use sudo or not?
whoami
식별하는 다른 명령으로 대체될 수 있습니다.WHO스크립트 실행 중
답변1
나는 당신이 이것을 원하는 이유와 sudo whoami
스크립트 시작 부분에서 사용자에게 즉시 암호를 묻고 사용자가 계속할 수 없을 때 종료하기 위해 뭔가를 실행하거나 수행 하지 않는 이유를 잘 이해하지 못한다는 것을 인정합니다. 좋아요. 적어도 Linux 시스템에서는 작동합니다( sudo
아직 다른 구현을 확인하지 않았습니다).
sudo_response=$(SUDO_ASKPASS=/bin/false sudo -A whoami 2>&1 | wc -l)
if [ $sudo_response = 2 ]; then
can_sudo=1
elif [ $sudo_response = 1 ]; then
can_sudo=0
else
echo "Unexpected sudo response: $sudo_response" >&2
exit 1
fi
askpass
여기서의 비결은 다른 프로그램을 사용하여 비밀번호를 확인하는 옵션을 활용하는 것입니다 . sudo
이를 설정하면 사용자가 루트로 명령을 실행할 수 있는지 여부에 따라 두 가지 표준 응답을 얻을 /bin/false
수 있습니다 .sudo
## A user with sudo rights
terdon@tpad $ SUDO_ASKPASS=/bin/false sudo -A whoami 2>&1
sudo: no password was provided
sudo: a password is required
## A user without sudo rights
bib@tpad $ SUDO_ASKPASS=/bin/false sudo -A whoami
bib is not in the sudoers file. This incident will be reported.
따라서 stderr을 stdout으로 리다이렉트한 후의 응답이 2줄이면 사용자는 sudo
명령을 실행할 수 있고, 1줄이면 명령을 실행할 수 없습니다.
중요한: 저는 이것을 광범위하게 테스트하지 않았습니다. 위에 표시된 것처럼 두 명의 사용자가 있는 단일 Arch Linux 시스템에서만 시도했습니다. 위 명령의 출력을 변경할 수 있다면 이것이 다른 시스템에서 예상대로 작동하지 않더라도 놀라지 않을 것입니다.
sudo
명백한 실패의 경우: 사용자가 비밀번호 없이 명령을 실행하도록 구성된 경우에는 작동하지 않습니다.
답변2
아직 명확한 확증은 찾지 못했지만 제 생각에는디자인에 의해이 작업은 인증이나 권한 없이 수행할 수 없습니다.
권한이 없는 사용자는 아닌 것 같아요~해야 한다사용자와 명령을 선택하고 해당 사용자에게 명령을 실행할 권한이 있는지 확인하는 기능 sudo
. 이는 공격자가 시스템을 조사하고 어떤 계정이 가장 가치 있는지 이해하는 데 큰 도움이 되지만 어떤 이점을 가져올지는 확실하지 않습니다.
/etc/sudoers
이 파일은 기본적으로 잠겨 있으며 루트 외에는 읽을 수 없다는 점에 유의할 가치가 있습니다 .
답변3
sudo
사용자가 명령 을 사용할 수 있는지 확인하고 싶지만아니요비밀번호를 적어야 합니다
groups user_name
사용자가 속한 모든 그룹이 표시됩니다. 사용자가 sudo
이 그룹의 구성원인 경우 사용자는가능한사용될 수 있다sudo
(@terdon이 지적했듯이 그룹 멤버십은 사용 권한을 부여하는 것이 아니지만 sudo
사용자가 단순히 "일반 사용자" 또는 "관리자"로 생성되는 일반적인 경우 sudo 그룹 멤버십은 사용 권한과 관련이 있습니다 sudo
).
if [ -z "$(groups user_name | grep sudo)" ]; then
echo 'user is not in sudo group'
else
echo 'user is in sudo group'
fi
물론 이것은 sudoers
파일에 존재할 수 있는 더 세분화된 권한을 알려주지는 않습니다. 이를 읽으려면 루트가 필요합니다.