루트 수준의 권한이 필요한 스크립트를 작성 중입니다. 스크립트가 루트로 실행되지 않는 경우 단순히 “루트로 실행하십시오.”라는 메시지를 표시합니다. 종료합니다.
내가 찾고있는 의사 코드는 다음과 같습니다.
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
어떻게하면 깨끗하고 안전하게 최선을 다할 수 있습니까? 감사!
아, 분명히 말하면 : (작업) 부분에는 자체적으로 루트가 필요한 명령을 실행하는 것이 포함됩니다. 따라서 일반 사용자로 실행하면 오류가 발생합니다. 이것은 스크립트 내에서 sudo를 사용하지 않고 루트 명령이 필요한 스크립트를 깨끗하게 실행하기위한 것입니다. 저는 구문 설탕을 찾고 있습니다.
답변
$ EUID 환경 변수는 현재 사용자의 UID를 보유합니다. Root의 UID는 0입니다. 스크립트에서 다음과 같은 것을 사용하십시오.
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
참고 : 당신이 얻는 경우에 2: [: Illegal number:
당신이있는 경우 검사를 #!/bin/sh
상단과로 변경 #!/bin/bash
.
답변
bash 스크립트에서는 실행중인 사용자가 root인지 확인하는 몇 가지 방법이 있습니다.
A와 경고를 사용자가 루트가 사용하는 것입니다 있는지 확인하지 않는 root
사용자 이름을. ID가 0 인 사용자가 호출된다는 보장은 없습니다 root
. 광범위하게 따르는 매우 강력한 규칙이지만 누구나 슈퍼 유저 이름을 다른 이름으로 바꿀 수 있습니다.
bash 를 사용할 때 가장 좋은 방법 $EUID
은 맨 페이지 에서을 사용 하는 것입니다.
EUID Expands to the effective user ID of the current user, initialized
at shell startup. This variable is readonly.
이것은 $UID
변경 될 수있는 보다 나은 방법이며 스크립트를 실행하는 실제 사용자를 반영하지 않습니다.
if (( $EUID != 0 )); then
echo "Please run as root"
exit
fi
내가 그런 종류의 문제에 접근하는 방법 sudo
은 루트로 실행되지 않을 때 내 명령 을 주입 하는 것입니다. 예를 들면 다음과 같습니다.
SUDO=''
if (( $EUID != 0 )); then
SUDO='sudo'
fi
$SUDO a_command
이렇게하면 수퍼 유저를 sudo
사용할 때 또는 일반 사용자 가 실행할 때 내 명령이 루트로 실행됩니다.
스크립트가 항상 루트에서 실행되는 경우 이에 따라 권한을 설정하십시오 ( 0500
).
답변
몇 가지 답변이 있지만 최선의 방법은 다음과 같습니다.
id -u
- 루트로 실행하면 id 0을 반환합니다.
이것은 다른 방법보다 신뢰할 수있는 것으로 보이며 스크립트가 실행 되더라도 id 0을 반환하는 것으로 보입니다 sudo
.
답변
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
또는
if [[ `id -u` -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
🙂
답변
@ wrikken은 그의 의견에서 언급했듯이 id -u
루트를 훨씬 잘 검사합니다.
또한을 올바르게 사용 sudo
하면 스크립트를 확인하여 루트로 실행 중인지 확인할 수 있습니다. 그렇지 않은 경우이를 통해 자신을 리콜 sudo
하고 루트 권한으로 실행하십시오.
스크립트의 기능에 따라 다른 옵션은 sudo
스크립트에 필요한 특수 명령에 대한 항목 을 설정하는 것입니다.
답변
루트 사용자에 대한 간단한 점검이 있습니다.
[[ stuff ]]
구문은 떠들썩한 파티에서 검사를 실행의 표준 방법입니다.
error() {
printf '\E[31m'; echo "$@"; printf '\E[0m'
}
if [[ $EUID -eq 0 ]]; then
error "Do not run this as the root user"
exit 1
fi
또한 실패하면 1로 종료한다고 가정합니다. 이 error
기능은 출력 텍스트를 빨간색으로 설정 하는 기능입니다 (필요하지는 않지만 나에게 묻는다면 꽤 고급 스럽습니다).
답변
아주 간단한 방법은 다음과 같습니다.
if [ "$(whoami)" == "root" ] ; then
# you are root
else
# you are not root
fi
대신에 이것을 사용하면 id
루트가 아닌 특정 사용자가 명령을 실행 중인지 확인할 수 있다는 이점이 있습니다. 예.
if [ "$(whoami)" == "john" ] ; then
# you are john
else
# you are not john
fi