私は、rootレベルのパーミッションを必要とするスクリプトを書いていますが、そのスクリプトがrootとして実行されない場合は、単に「rootとして実行してください」とエコーするようにしたいのです。そして終了します。
これが私が探しているもののための擬似コードです。
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
これをどのようにして(きれいにそして安全に)達成することができるでしょうか。ありがとうございます。
あ、明確にするために、(ものを行う)部分には、それ自体にrootを必要とするコマンドを実行する必要があります。そのため、通常のユーザーとして実行するとエラーが発生します。これは、スクリプト内でSudoを使用せずに、rootコマンドを必要とするスクリプトをきれいに実行することを目的としています。私は構文糖を探しています。
いくつかの答えが出されていますが、使用するのが最善の方法であると思われます。
id -u
これは他の方法よりも信頼性が高く、スクリプトがSudo
を介して実行された場合でも、0のIDを返すようです。
$ EUID環境変数は、現在のユーザーのUIDを保持します。ルートのUIDは0です。スクリプトに次のようなものを使用してください。
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
注:2: [: Illegal number:
が表示された場合は、先頭に#!/bin/sh
があるかどうかを確認して、#!/bin/bash
に変更してください。
Bashスクリプトでは、実行中のユーザーがrootかどうかを確認する方法がいくつかあります。
警告として、root
ユーザー名を使用してユーザーがrootであるかどうかを確認しないでください。 ID 0のユーザーがroot
と呼ばれることを保証するものは何もありません。これは広く守られている非常に強力な規約ですが、誰でもスーパーユーザーを別の名前に変更することができます。
bashを使用するときの最良の方法は、manページから$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
私がそのような問題に取り組む方法は、rootとして実行されていないときにコマンドにSudo
を挿入することです。これが一例です。
Sudo=''
if (( $EUID != 0 )); then
Sudo='Sudo'
fi
$Sudo a_command
これにより、スーパーユーザーを使用している場合は私のコマンドがrootで実行され、一般ユーザーが実行している場合はSudo
が実行されます。
スクリプトを常にrootで実行する場合は、それに応じて権限を設定してください(0500
)。
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
はrootのためのはるかに良いチェックです。
さらに、Sudo
を適切に使用すれば、スクリプトをチェックして、それがrootとして実行されているかどうかを確認できます。そうでない場合は、Sudo
を介して自分自身を呼び戻してから、root権限で実行します。
スクリプトの動作によっては、スクリプトが必要とする特殊なコマンドに対してSudo
エントリを設定するという方法もあります。
ユーザーがrootであることの簡単な確認があります。
[[ stuff ]]
構文は、bashでチェックを実行するための標準的な方法です。
error() {
printf '\E[31m'; echo "$@"; printf '\E[0m'
}
if [[ $EUID -eq 0 ]]; then
error "This script should not be run using Sudo or as the root user"
exit 1
fi
これはまた失敗した場合は1で終了したいと仮定しています。 error
関数は出力テキストを赤に設定するいくつかの才能です(必要ではありませんが、あなたが私に尋ねればかなり上品です)。
0 - 公式のGNU Linuxドキュメントを読んでください。正しく行うには多くの方法があります。
1-解釈の誤りを避けるためにあなたがシェル署名を入れることを確認してください:
#!/bin/bash
2-これは私のスクリプトです
#!/bin/bash
if [[ $EUID > 0 ]]; then # we can compare directly with this syntax.
echo "Please run as root/Sudo"
exit 1
else
#do your stuff
fi
非常に単純な方法はちょうど置く:
if [ "$(whoami)" == "root" ] ; then
# you are root
else
# you are not root
fi
id
の代わりにこれを使用する利点は、特定のroot以外のユーザーがコマンドを実行しているかどうかも確認できることです。例えば。
if [ "$(whoami)" == "john" ] ; then
# you are john
else
# you are not john
fi
スクリプトが本当にrootアクセスを必要とするなら、そのファイルパーミッションはそれを反映するべきです。 root以外のユーザーがrootスクリプトを実行可能にすることは、赤旗です。 if
チェックでアクセスを制御しないことをお勧めします。
chown root:root script.sh
chmod u=rwx,go=r script.sh
次のコードを試してください。
if [ "$(id -u)" != "0" ]; then
echo "Sorry, you are not root."
exit 1
fi
OR
if [ `id -u` != "0" ]; then
echo "Sorry, you are not root."
exit 1
fi
id -u
はwhoami
よりはるかに優れています。AndroidのようないくつかのシステムはWordルートを提供しないかもしれないからです。
例:
# whoami
whoami
whoami: unknown uid 0
私が知る限り、それをチェックする正しい方法は以下のとおりです。
if [ $(id -u) = "0" ]; then
echo "You are root"
else
echo "You are NOT root"
fi
ここで「ルートのテスト」を参照してください。
この答えでは、私は読者が bash
と _ posix _ のような dash
のようなシェルスクリプトを読むことができると思います。
非常に投票された回答がその多くを説明しているので、ここで説明することはあまりないと思います。
それでも、さらに説明することがあれば、コメントすることを躊躇しないでください、私はギャップを埋めるために最善を尽くします。
bash
ソリューションGNU bash
、バージョン4.4.19でroot
とSudo
の両方で動作することを確認済み
#!/bin/bash
function am_i_root {
! (( ${EUID:-0} || $(id -u) ))
}
if am_i_root; then
tput bold; tput setaf 2; echo 'Ok, you are root!'; tput sgr0
else
tput bold; tput setaf 1; echo 'Sad, you are NOT root :('; tput sgr0
fi
$EUID
コマンドを実行して _ posix _ - ユーザーIDを見つけるよりも、id -u
standard bash
変数、つまり有効なユーザーID番号を読み取る方がはるかに高速です。両方ともうまく詰まった関数に。何らかの理由で$EUID
が利用できない場合に限り、id -u
コマンドが実行され、適切な戻り値状況に関係なくが取得されます。
さて、私が正しく見れば、上のコードの欠けている部分があるように思えます。
お分かりのように、考慮しなければならない変数はたくさんありますが、そのうちの1つはパフォーマンスと信頼性の組み合わせです。
dash
バージョン0.5.8でroot
とSudo
の両方で動作することを確認
#!/bin/sh
am_i_root() {
[ "$(id -u)" -eq 0 ]
}
if am_i_root; then
tput bold; tput setaf 2; echo 'Ok, you are root!'; tput sgr0
else
tput bold; tput setaf 1; echo 'Sad, you are NOT root :('; tput sgr0
fi
あなたがおそらくそれを好きではない限り、Linux環境は非常に多様化しました。 bash
をとても好む人がいるという意味で、彼らは移植性さえ考えていません( _ posix _ shells)。私のような人は _ posix _ シェルを好む。それは今日個人的な選択とニーズの問題です。
Rootをチェックし、失敗したら終了します。
func_check_for_root() {
if [ ! $( id -u ) -eq 0 ]; then
echo "ERROR: $0 Must be run as root, Script terminating" ;exit 7
fi
}
func_check_for_root
また、誰がスクリプトを呼び出したのか、現在誰がスクリプトを実行しているのかを知りたい場合は、whoamiと「who am i」もあります。
it@it-ThinkPad-W510:~$ who am i
it pts/19 2014-06-03 12:39 (:0.0)
it@it-ThinkPad-W510:~$ Sudo who am i
[Sudo] password for it:
it pts/19 2014-06-03 12:39 (:0.0)
(Sudoと呼ばれてもユーザーIDを与えることを見てください)
it@it-ThinkPad-W510:~$ Sudo whoami
root
だから、
if [ "$(whoami)" == "user" ]; then
echo "Executing the installer script"
else
echo "user is only allowed to execute the installer script"
fi
スクリプトをrootでのみ実行可能にする簡単な方法の1つは、次の行でスクリプトを開始することです。
#!/bin/su root