ルートでない場合にスクリプトが実行されないようにするにはどうすればよいですか? (「ルートとして実行されません!終了中...」と表示されます。)

ルートでない場合にスクリプトが実行されないようにするにはどうすればよいですか? (「ルートとして実行されません!終了中...」と表示されます。)

私のソースは次のとおりです。

#!/bin/bash

echo "Running script to free general cached memory!"
echo "";
echo "Script must be run as root!";
echo "";
echo "Clearing swap!";
swapoff -a && swapon -a;
echo "";
echo "Clear inodes and page file!";
echo 1 > /proc/sys/vm/drop_caches;
echo "";

キャッシュやその他の項目を消去し、端末でrootとして実行する必要があると言います。デフォルトでは、スクリプトがルートとして実行されていないことを検出した場合は、スクリプトの実行を停止したいと思います。

例:

"Running script to free general cached memory!"
"Warning: script must be run as root or with elevated privileges!"
"Error: script not running as root or with sudo! Exiting..."

高い権限で実行すると正常に実行されます。どんなアイデアがありますか?ありがとうございます!

答え1

#!/bin/sh

if [ "$(id -u)" -ne 0 ]; then
        echo 'This script must be run by root' >&2
        exit 1
fi

cat <<HEADER
Host:          $(hostname)
Time at start: $(date)

Running cache maintenance...
HEADER

swapoff -a && swapon -a
echo 1 >/proc/sys/vm/drop_caches

cat <<FOOTER
Cache maintenance done.
Time at end:   $(date)
FOOTER

rootユーザーのUIDは0です(「root」アカウント名に関係ありません)。返された有効なUIDがid -u0以外の場合、ユーザーはroot権限でスクリプトを実行しません。id -ru実際のID(ユーザーのUID)テスト用移動するスクリプト)。

$EUID権限のないユーザーが変更できるため、スクリプトで使用しないでください。

$ bash -c 'echo $EUID'
1000

$ EUID=0 bash -c 'echo $EUID'
0

ユーザーがこれを行うと、明らかに特権の昇格は発生しませんが、スクリプトのコマンドが実行する必要がある操作を実行せずに、ファイルが誤った所有者として生成される可能性があります。

答え2

あなたが望むのは、スーパーユーザー権限があること、つまり有効なユーザーIDが0であることを確認することです。

zsh以下を実行できるように変数で使用可能bashにします。$EUID

if ((EUID != 0)); then
  echo >&2 "Error: script not running as root or with sudo! Exiting..."
  exit 1
fi

POSIX に似たシェルでは、id標準コマンドを使用できます。

if [ "$(id -u)" -ne 0 ]; then
  echo >&2 "Error: script not running as root or with sudo! Exiting..."
  exit 1
fi

id -unまたはwhoamiまたは のすべての$USERNAME変数はzsh以下を提供します。最初uidのユーザー名。他のユーザーのIDが0のシステムでは、そのrootプロセスが認証されたプロセスの子プロセスであってもそうでない可能性がありますroot

$USER会議通常認証されたユーザーを提供しますが、それに依存するのはかなり脆弱です。これはシェルでは設定されませんが、通常は認証コマンドによって設定されます(たとえばloginsu(GNU / Linuxシステムでは必ずしも他のシステムである必要はありません)、sudosshd少なくともopensshのコマンド)...)。しかし、これは必ずしもそうではなく(uidの変更はこの変数を自動的に設定せず、uidを変更するアプリケーションによって明示的に実行されるべきです)、シェルの祖先の他のプロセスによって変更された可能性があります。$LOGNAME、同じ警告はPOSIX(元のFIPS 151-2)によって指定されるため、より安定しています。

答え3

$USERまたはを使用してwhoami現在のユーザーを確認できます。

if [[ "$USER" != "root" ]]; then
    echo "Error: script not running as root or with sudo! Exiting..."
    exit 1
fi

if [[ $(whoami) != "root" ]]; then
    echo "Warning: script must be run as root or with elevated privileges!"
    exit 1
fi

if [[ $(id -u) != "0" ]]; then
    echo "Error: script not running as root or with sudo! Exiting..."
    exit 1
fi

答え4

実際に望むのは、これらのタスクを実行する権限があることを確認することです。代わりに、ルートであることを確認することは悪い習慣と見なされます。

ルート以外のユーザーがスワップを変更してページキャッシュを削除できるようにシステムが構成されている場合、そのユーザーがスクリプトを実行しないのはなぜですか。

代わりに、単に操作を試みて失敗した場合は、便利なメッセージで終了できます。

if ! ( swapoff -a && swapon -a )
then
  echo "Failed to clear swap (rerun as root?)" >&2
  exit 1
fi

if ! echo 1 > /proc/sys/vm/drop_caches
then 
  echo "Failed to free page cache (rerun as root?)" >&2
  exit 1
fi

関連情報