単純なbashスクリプトを書いていますが、rootとして実行されているかどうかを確認するために必要です。おそらくそれを行うための非常に簡単な方法があることは知っていますが、その方法はわかりません。
ただ明確にします:
スクリプトを記述する簡単な方法は何ですかfoo.sh。コマンド./foo.sh
は0
を出力し、コマンドSudo ./foo.sh
は1
を出力します
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
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
としてログインすると、次の結果が得られます。
whoami
:rootx
echo $USER
:root2
(プログラムが空の環境で起動された場合、空の文字列を返します。例:env -i sh -c 'echo $USER'
)id -u
:0
ご覧のとおり、他のプログラムはこのチェックに失敗し、id -u
のみが合格しました。更新されたスクリプトは次のようになります。
#!/bin/bash
if ! [ $(id -u) = 0 ]; then
echo "I am not root!"
exit 1
fi
@ 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
これは、現在のユーザーを返す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' ]
効率を考慮して、最初に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)"))
}
#!/bin/bash
[[ $(id -u) != 0 ]]
echo $?
スクリプトをrootでのみ実行可能にする簡単な方法の1つは、次の行でスクリプトを開始することです。#!/bin/su root
このスニペットは:
Sudo !!
を使用することをお勧めしますif ["$(whoami&2>/dev/null)"!= "root"] && ["$(id -un&2>/dev/null)"!= "root"] then echo "このスクリプトを実行するにはrootでなければなりません!" echo "use 'Sudo !!'" exit 1 fi
この答えはアイデアを保存するためのものであり、あなたの一部にとって役立つかもしれません。デスクトップ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
でインストールしてください。
#!/bin/bash
uid=`id -u`
if [ "$uid" == "0" ]
then
echo 1
else
echo 0
fi
このコードは、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