web-dev-qa-db-ja.com

スクリプトは、rootとして実行されているかどうかをどのように確認できますか?

単純なbashスクリプトを書いていますが、rootとして実行されているかどうかを確認するために必要です。おそらくそれを行うための非常に簡単な方法があることは知っていますが、その方法はわかりません。

ただ明確にします:
スクリプトを記述する簡単な方法は何ですかfoo.sh。コマンド./foo.sh0を出力し、コマンドSudo ./foo.sh1を出力します

100
Malabarba
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi
144
aneeshep

Rootユーザーの名前は「root」である必要はありません。 whoamiは、ユーザーID 0の最初のユーザー名を返します。 $USERにはログインしているユーザーの名前が含まれ、ユーザーID 0を持つことができますが、名前は異なります。

アカウントがルートとしてログインしているかどうかを確認する唯一の信頼できるプログラム:

id -u

effectiveユーザーIDには-uを使用し、realユーザーIDには-rではありません。パーミッションは 決定済みeffectiveユーザーIDであり、realのIDではありません。

テスト

/etc/passwdには、ユーザーID 0の次のユーザー名が所定の順序で含まれています。

rootx
root2

root2としてログインすると、次の結果が得られます。

  • whoamirootx
  • echo $USERroot2(プログラムが空の環境で起動された場合、空の文字列を返します。例:env -i sh -c 'echo $USER'
  • id -u0ご覧のとおり、他のプログラムはこのチェックに失敗し、id -uのみが合格しました。

更新されたスクリプトは次のようになります。

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi
112
Lekensteyn

@ Lekensteynが言った のように、有効なユーザーIDを使用する必要があります。 bashでid -uを呼び出す必要はありません。

#!/bin/bash

if [[ $EUID -ne 0 ]]; then
   echo "You must be root to do this." 1>&2
   exit 100
fi

コメントからの@geirhaの提案は、算術評価を使用しています。

#!/bin/bash

if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi
30
jfs

これは、現在のユーザーを返すwhoamiコマンドを使用して実行できます。

#!/bin/bash

if [ `whoami` != 'root' ]
  then
    echo "You must be root to do this."
    exit
fi

...

上記を実行すると、現在のユーザーがrootでない場合、You must be root to do this.が出力されます。


注:場合によっては、$USER変数を単純にチェックすることもできます。

if [ $USER != 'root' ]
20
Nathan Osman

効率を考慮して、最初にEUID環境変数をテストし、それが存在しない場合は、標準のidコマンドを呼び出します。

if ((${EUID:-0} || "$(id -u)")); then
  echo You are not root.
else
  echo Hello, root.
fi

このように、ORショートカットがあるため、システムコマンドを呼び出さずに、メモリ内変数のクエリを優先します。

コードの再利用:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}
10
Luchostein
#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?
9
João Pinto

スクリプトをrootでのみ実行可能にする簡単な方法の1つは、次の行でスクリプトを開始することです。
#!/bin/su root

2
alexandre1985

このスニペットは:

  • さまざまなセッションで確認する
  • Sudo !!を使用することをお勧めします
  • エラーを返します
 if ["$(whoami&2>/dev/null)"!= "root"] && ["$(id -un&2>/dev/null)"!= "root"] 
 then 
 echo "このスクリプトを実行するにはrootでなければなりません!" 
 echo "use 'Sudo !!'" 
 exit 1 
 fi 
1
rubo77

この答えはアイデアを保存するためのものであり、あなたの一部にとって役立つかもしれません。デスクトップGUIから実行され、root権限が必要なスクリプトが必要な場合は、次の方法を試してください。

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   gksudo -w $0 $@
   exit
fi

#here go superuser commands, e.g. (switch intel cpu into powersave mode):
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
cpupower frequency-set -g powersave

この方法で、rootユーザーのパスワードを尋ねる素敵なダイアログウィンドウが表示されます。コマンドラインのSudoと同じです。

gksudoがシステムで使用できない場合は、Sudo apt-get install gksuでインストールしてください。

1
gertas
#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi
1
Delan Azabani

このコードは、EUIDを定義しないBashとBourne sh(FreeBSDでテスト済み)の両方で動作します。 EUIDが存在する場合、その値が返され、そうでない場合は「id」コマンドが実行されます。シェルの組み込み「:-」を使用するため、上記の「または」の例よりも少し短いです。

Shのルート:

# echo $EUID

# euid=${EUID:-`id -u`}
# echo $euid
0

In bash:
[chaapala@tenfwd2 ese]$ euid=${EUID:-`id -u`}
[chaapala@tenfwd2 ese]$ echo $euid
10260
0
Clayton Haapala