Bashスクリプト:ルートとして(またはsudoで)スクリプトを実行する必要があります


26

tarを使用してディレクトリをバックアップするbashスクリプト(Ubuntuで)を作成しようとしています。

スクリプトをrootとして(またはsudoでのみ)実行できるようにチェックするにはどうすればよいですか?

たとえば、ユーザーがスクリプトを実行する場合、このスクリプトはsudo特権で実行する必要があると言ってから終了する必要があります。スクリプトがルートとして実行される場合、チェックを過ぎて続行します。

簡単な解決策がなければならないことは知っていますが、グーグルで見つけることができませんでした。

回答:


37

有効なuidを取得するには、次のコマンドを使用します。

id -u

結果が「0」の場合、スクリプトはrootとして実行されているか、sudoを使用しています。次のようなことを実行して、チェックを実行できます。

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

5
idへのパスを完全修飾することをお勧めします(たとえば、/ usr / bin / id)。さもなければ、よこしまなユーザーは、常に0を返す独自のスクリプト/バイナリを記述し、実行ユーザーのパスの前に存在する場所にそれを置くことができます。
ktower 2009

同意した。編集で修正。
スコットパック

6
idへのフルパスを使用して、スクリプトを実行しようとする「よこしまな」人があなたによって停止されることはありません。

私は他の人に同意します...それはbashスクリプトです。「id」ビンを認定しても、とにかく小切手を回避しようと真剣に考えている人を止めることはできません。移植性のために無資格のままにしておく方が良いでしょう。
クリス

1
これは「sudo」要件に対応していません。
GregB

17

所有権をルートに変更することであなたが知っていると思います

chown root:root file

パーミッションを700に設定します

chmod 700 file

あなたは同じことを達成します-sudoとして実行する提案なし。

しかし、完全を期すためにこの回答を掲載します。


3
これは、受け入れられている答えよりも適切なソリューションです。-私の0.02ドル
クリス

サイドノート:スクリプトをgitにチェックインすることは難しくなります。修正するには、sudo git add <file>
Chaim Eliyah

2

ここでの目的は、スクリプトをルートとして、または何らかのセキュリティ予防策として実行する必要があることをユーザーに通知することです。

ユーザーに通知したいのは、uidの提案はどれでも結構ですが、セキュリティ対策として馬のタイヤと同じくらい便利です-ユーザーがスクリプトをコピーしてifステートメントを削除するのを止めるものはありません。とにかくそれを実行します。

これがセキュリティ上の問題である場合、スクリプトは、root:rootが所有する700に設定し、他のユーザーが読み取りまたは実行できないようにする必要があります。


または、私の場合のように、スクリプトがその作業を実行するためにルートにのみアクセス可能なファイルまたはコマンドへのアクセスを必要とする可能性があります
-chrisbunney

2

whoamiコマンドも使用できます。

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

実際、uid 0は完全な特権を持つ特別なユーザーアカウントです。「ルート」は、単にそのUIDにマップされる最も一般的なラベル/名前です。「ルート」である必要はなく、攻撃者がこれを悪用しようとする場合があります。
-0xSheepdog

2

bash変数$EUIDは、スクリプトが実行されている有効なUIDを示します。スクリプトがルートとして実行されることを確認する場合$EUIDは、値0が含まれているかどうかを確認します。

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

/usr/bin/id外部コマンドを必要としないため、これは(bashスクリプト用!)を使用したソリューションよりも優れています。


1
代わりにちょうど出て行くの、置換することによって、sudoのログイン用のユーザーを促すことができるechoの行をsudo "$0" "$@"し、交換してくださいexit 2exit $?
schumacher574

良いアイデア。ただし、質問は、sudoを単独で実行するのではなく、終了するスクリプトを要求しました。
ノイハウス

0

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


-1

「#!/ bin / su root」は、スーパーユーザーモードのユーザーがrootパスワードを使用せずにスクリプトを実行できるようにします。スーパーユーザーにrootの結果でスクリプトを実行させたい場合、これを行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.