回答:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
if ((EUID)); then
。@ geirhaのコメントを
sudo
ます。実行sudo sh -c 'echo $EUID'
すると、期待どおりの結果が表示されます。
$EUID
(@DavidFoersterによって前述したように)Bashismあり、そして、あなたが/bin/sh
最も可能性へのリンクである/bin/dash
、ではありません/bin/bash
。sudo bash -c 'echo $EUID'
期待される結果が得られます。
rootユーザーの名前は「root」である必要はありません。whoami
ユーザーIDを持つ最初のユーザー名を返します0
。$USER
ログインしているユーザーの名前が含まれます。ユーザーIDを持つことはできますが0
、名前は異なります。
アカウントがルートとしてログインしているかどうかを確認する唯一の信頼できるプログラム:
id -u
私は使用-u
のための実効ユーザーID、いない-r
ため、実際のユーザーID。許可は、実際のユーザーIDではなく、有効なユーザー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
id -u
bashでaskubuntu.com/questions/30148/...
sh
(dash
)をインタープリターとして使用して、可能な限りPOSIXに準拠するようにしbash
ます。しかし、良いショットは、別のフォークを保存します:)
[ -w / ]
。考え方は変わりません。注:特定のchrootsでは、存在し[ -w /etc/shadow ]
ないため失敗します。/etc/shadow
そのため、次のアプローチ/
が推奨されます。より良い方法は、ルート権限の実際の必要性をチェックすることです。スクリプトがに書き込む必要がある場合は、/etc/someconfig
そのファイルが書き込み可能か、ファイルが存在せず書き込み可能かを確認してください/etc
。
以下のよう@Lekensteynは言いますが、実効ユーザIDを使用する必要があります。id -u
bashで呼び出す必要はありません。
#!/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
((..))
、数字のテスト、および[[..]]
文字列とファイルのテストに使用する必要があるため、if (( EUID != 0 )); then
代わりに、または単にif ((EUID)); then
EUID
になるはず$EUID
です。を使用(( $EUID != 0 ))
する代わりに、を使用します[ $EUID != 0 ]
。それも動作しdash
ます。
EUID
動作します。質問はタグ付けされてbash
いませんdash
。コマンドはenv -i sh -c '[ $EUID != 0 ]'
失敗しますが、env -i bash -c '(( EUID != 0 ))'
機能します。ところで、dash
Ubuntuの一部の非ASCII文字では動作しませんstackoverflow.com/questions/5160125/…2011年であり、他の言語を使用する人々がいます。
$EUID
。その結果、受け入れられた答えを変更しました。
whoami
現在のユーザーを返すコマンドを使用して、これを実現できます。
#!/bin/bash
if [ `whoami` != 'root' ]
then
echo "You must be root to do this."
exit
fi
...
You must be root to do this.
現在のユーザーがそうでない場合、上記を実行すると印刷されますroot
。
注:場合によっては、$USER
変数を単純にチェックすることもできます。
if [ $USER != 'root' ]
$USER
特にこの方法での使用はお勧めしません。$USER
ログインシェルによって設定される場合、プログラムに伝播する必要はありません(env -i sh -c 'echo $USER'
)。そのように、$USER
は空であり、構文エラーが発生します。
$USER
はシェルによって設定されるだけでなく、なりすましやすいものでもあります。Whoamiは実際のユーザーを返します。
$USER
はシェルによって解釈されますsudo sh -c 'echo $USER'
。意味を持たせるためには、例が必要です。@George:UID 0に対してwhoami
常に返さ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)"))
}
id -u
。ここではそれ以下の結果と一緒にベンチスクリプトを参照してください。pastebin.com/srC3LWQy
スクリプトをrootでのみ実行可能にする簡単な方法の1つは、次の行でスクリプトを開始することです。
#!/bin/su root
この答えはアイデアを保存するためのものであり、あなたの一部にとって役立つかもしれません。デスクトップ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
。
このコードは、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