解決策 1:
はい、プログラムが sudo で実行されている場合、4 つの環境変数が設定されます:
$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20
これらは設定するだけで偽装できることに注意してください。重要なことで彼らを信用しないでください。
例:このプログラムでは、ユーザーに他のプログラムを実行するように指示する必要があります。現在のものが sudo で実行された場合、もう一方も実行されます。
#!/bin/bash
echo 'Thank you for running me.'
if [[ $(id -u) == 0 ]]; then
if [[ -z "$SUDO_COMMAND" ]]; then
echo 'Please now run: next_command'
else
echo 'Please now run: sudo next_command'
fi
else echo 'Error: Sadly you need to run me as root.'
exit 1
fi
root として実行されていることを最初に証明できる場合にのみ、SUDO_* 変数をテストすることに注意してください。それでも、役に立つテキストを変更するためにのみ使用します。
解決策 2:
これは質問に直接答えるものではありませんが、ここで正しい質問がされているとは思いません。質問者は、特定の権限があるかどうかでおそらく異なる動作をするプログラムを望んでいるように見えますが、sudoのチェックはそれを行う方法ではないと主張します。まず、多くのシステムが「sudo」を実装していない可能性があります。Linux や多くの Unix では決して必要ありません。
たとえば、ユーザーがすでに root としてログインしている可能性があり、sudo が無意味になったり、プログラムが実行したい管理タスクを実行する機能をまだ持っている非 root ユーザーがシステムに含まれている可能性があります。最後に、システムには root または sudo がまったくなく、代わりにさまざまな機能を備えた必須のアクセス制御システムを使用し、sudo へのすべてのスーパーユーザーをキャッチしない可能性があります。または、ユーザーは sudo される可能性がありますが、セキュリティ上の理由から、自分のアカウントよりも権限が少ないアカウントにアクセスできます (権限を上げずに削除するために RAM ディスクにのみ書き込むことができる一時的な権限のないユーザーで、信頼できないコードを実行することがよくあります)。 sudo や root の存在などの特定のパーミッション モデルを想定したり、sudo されたユーザーが特定の権限を持っていると想定したりすることは、全体的に悪い考えです。
操作を実行する権限があるかどうかを確認したい場合は、通常、単純に実行してから、失敗した場合、またはすべてが失敗するかすべて成功する必要がある複数段階の操作であるかどうかについて、errno で権限の問題を確認するのが最善の方法です。操作が POSIX アクセス関数などの関数で機能するかどうかを確認できます (権限が積極的に変更されている場合は、ここで競合状態が発生する可能性があることに注意してください)
さらに、sudo の背後にある実際のユーザーを知る必要がある場合は、getlogin 関数を使用できます。これは、基礎となる端末との対話型セッションで機能し、たとえば、監査のためにコマンドを「実際に」実行しているユーザーを見つけたり、ログを保存する実ユーザーのホーム ディレクトリ。
最後に、ユーザーがルート アクセス権を持っているかどうかを確認することが本当に必要な場合 (これも悪い考えですが、実装にあまり依存していません)、getuid を使用して uid が 0 であること、したがってルートであることを確認できます。
解決策 3:
使用できるメカニズムは 2 つあります。
- 環境変数のチェックは、どちらの方法でも偽造できますが、最も簡単です。
growisofs
は SUDO の下で実行するのが好きではないので、それを使用するスクリプトで SUDO 変数の設定を解除します。他の方法で偽造することができます。 (SUDO変数は、atおよびbatchコマンドで実行されるスクリプトの環境にも渡されます。) - sudo で実行しているかどうかを確認する別の方法は、sudo を探して親プロセスからプロセス リストをたどることです。この方法で sudo の下で実行していたことを隠すのは難しいですが、より複雑です。 sudo で実行していると偽ることは依然として可能です。
適切なユーザーとして実行しているかどうかを確認する方が一般的です。 id
コマンドを使用してこれを行うことができます。 TomOnTime のスクリプトは id
を使用しています sudo
かどうかを判断するコマンド 次のコマンドを実行するために必要になる場合があります。
解決策 4:
有効なユーザー ID と実際のユーザー ID を比較できます。
これは、undo sudo を実行していることを厳密に意味するものではありません (setuid も設定されている可能性があります)。ただし、プログラムがユーザーが期待するよりも多くの権利を持っていることを示しています。インストール中またはアップデートをインストールするためにそれらを実行します。その後、これを使用して、それに関する警告フィードバックを提供できます)。
解決策 5:
次のように、有効な UID (EUID) 変数を確認できます。
if [[ $EUID -eq 0 ]]; then
echo "running as root"
else
echo "not running as root"
fi