web-dev-qa-db-ja.com

bashスクリプトでrootとして実行しているかどうかを確認する方法

私は、rootレベルのパーミッションを必要とするスクリプトを書いていますが、そのスクリプトがrootとして実行されない場合は、単に「rootとして実行してください」とエコーするようにしたいのです。そして終了します。

これが私が探しているもののための擬似コードです。

if (whoami != root)
  then echo "Please run as root"

  else (do stuff)
fi

exit

これをどのようにして(きれいにそして安全に)達成することができるでしょうか。ありがとうございます。

あ、明確にするために、(ものを行う)部分には、それ自体にrootを必要とするコマンドを実行する必要があります。そのため、通常のユーザーとして実行するとエラーが発生します。これは、スクリプト内でSudoを使用せずに、rootコマンドを必要とするスクリプトをきれいに実行することを目的としています。私は構文糖を探しています。

234
Nathan

いくつかの答えが出されていますが、使用するのが最善の方法であると思われます。

  • id -u
  • Rootとして実行した場合、0のIDが返されます。

これは他の方法よりも信頼性が高く、スクリプトがSudoを介して実行された場合でも、0のIDを返すようです。

56
Nathan

$ EUID環境変数は、現在のユーザーのUIDを保持します。ルートのUIDは0です。スクリプトに次のようなものを使用してください。

if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi

注:2: [: Illegal number:が表示された場合は、先頭に#!/bin/shがあるかどうかを確認して、#!/bin/bashに変更してください。

330
ptierno

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)。

69
sberder
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

:)

45
Dale_Reagan

@wrikkenが彼のコメントで述べたように、id -uはrootのためのはるかに良いチェックです。

さらに、Sudoを適切に使用すれば、スクリプトをチェックして、それがrootとして実行されているかどうかを確認できます。そうでない場合は、Sudoを介して自分自身を呼び戻してから、root権限で実行します。

スクリプトの動作によっては、スクリプトが必要とする特殊なコマンドに対してSudoエントリを設定するという方法もあります。

29

ユーザーが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関数は出力テキストを赤に設定するいくつかの才能です(必要ではありませんが、あなたが私に尋ねればかなり上品です)。

21

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
11
Sergio Abreu

非常に単純な方法はちょうど置く:

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
9
Matthew Trotter

スクリプトが本当にrootアクセスを必要とするなら、そのファイルパーミッションはそれを反映するべきです。 root以外のユーザーがrootスクリプトを実行可能にすることは、赤旗です。 ifチェックでアクセスを制御しないことをお勧めします。

chown root:root script.sh
chmod u=rwx,go=r script.sh
8
John Kugelman

次のコードを試してください。

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
5
MLSC

id -uwhoamiよりはるかに優れています。AndroidのようないくつかのシステムはWordルートを提供しないかもしれないからです。

例:

# whoami
whoami
whoami: unknown uid 0
3
Smeterlink

私が知る限り、それをチェックする正しい方法は以下のとおりです。

if [ $(id -u) = "0" ]; then
    echo "You are root"
else
    echo "You are NOT root"
fi

ここで「ルートのテスト」を参照してください。

http://linuxcommand.org/lc3_wss0080.php

3
WebBrother

この答えでは、私は読者が bash_ posix _ のような dash のようなシェルスクリプトを読むことができると思います。

非常に投票された回答がその多くを説明しているので、ここで説明することはあまりないと思います。

それでも、さらに説明することがあれば、コメントすることを躊躇しないでください、私はギャップを埋めるために最善を尽くします。

パフォーマンスと信頼性のために最適化された bash ソリューション

GNU bash、バージョン4.4.19でrootSudoの両方で動作することを確認済み

#!/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コマンドが実行され、適切な戻り値状況に関係なくが取得されます。

何年もの間OPが尋ねてきたのになぜ私がこの解決策を投稿するのか

さて、私が正しく見れば、上のコードの欠けている部分があるように思えます。

お分かりのように、考慮しなければならない変数はたくさんありますが、そのうちの1つはパフォーマンスと信頼性の組み合わせです。


_ posix _ solution

dashバージョン0.5.8でrootSudoの両方で動作することを確認

#!/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 _ シェルを好む。それは今日個人的な選択とニーズの問題です。

2

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
1
Mike Q

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

#!/bin/su root

1
alexandre1985