bashスクリプトを実行したユーザーの名前をsudoとして取得する方法は?


17

sudoで実行する必要があるが、それを実行した非sudoユーザーの名前を考慮する必要があるbashスクリプトを作成したい。したがって、ユーザーbobが実行した場合、それを実行したのが知りsudo ./myscript.shたいと思います。myscript.shbob

中を見てみましょうmyscript.sh

USER=$(whoami)
# Do something that takes into account the username.

プロセスを生成したユーザーの名前を知るにはどうすればよいですか?より具体的にはwhoami、取得する代わりに取得する代わりに何を使用する必要がbobありrootますか?


これは有効なスクリプトではありませんUSER=$(whoami)USERはシェルの内部変数として既に存在することに注意してください。また、bashスクリプトの場合sh、を使用して実行しないください。これには、POSIX互換の機能のサブセットしかありません
nyuszika7h 14年

なぜ編集しないのですか?現在修正済み。
マルシオ14年

あまりにも簡単です。編集は少なくとも6文字、少なくとも推奨される文字である必要があります。
nyuszika7h 14年

わかった。ヒントをありがとう:DIは通常#!/usr/bin/env bash、私のbashスクリプトにこのようなhashbangを置きます。
marcio 14年

hashbangは、明示的にshまたは他のものを呼び出した場合、無視されます。
nyuszika7h 14年

回答:


28

私はそれがどれほど標準的かはわかりませんが、少なくともUbuntuシステムsudoでは次の環境変数を設定します(とりわけENVIRONMENT-sudoマンページのセクションを参照)。

   SUDO_UID        Set to the user ID of the user who invoked sudo

   SUDO_USER       Set to the login of the user who invoked sudo

例えば、

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver

テストしたすべてのプラットフォーム(debian、fedora(redhat)、freebsd)で期待どおりに動作します。ありがとう!
マルシオ14年

Macでの動作を確認しました。
SiKing

Ubuntuでも動作します。
アンディジェイ

9

sudo使用せずに動作させたい場合は、を使用します${SUDO_USER:-$USER}。例えば:

printf '%s\n' "${SUDO_USER:-$USER}"

説明

${var:-val}に展開さ$varvalます。設定されていないか空でない場合は、に展開されます。

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