[bash] bash 스크립트에서 루트로 실행 중인지 확인하는 방법

루트 수준의 권한이 필요한 스크립트를 작성 중입니다. 스크립트가 루트로 실행되지 않는 경우 단순히 “루트로 실행하십시오.”라는 메시지를 표시합니다. 종료합니다.

내가 찾고있는 의사 코드는 다음과 같습니다.

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