環境
- Ubuntu 15.04
- sudo 1.8.9p5
- /etc/sudoers に env_reset を設定。
調査
コマンドは info
の User information の項目 (info id
の 1 ページ前) と、ユーザーを表す環境変数から選んだ。
手動
$ sudo echo $USER
user1
$ sudo echo $UID
1000
$ sudo id
uid=0(root) gid=0(root) groups=0(root)
$ sudo logname
user1
$ sudo whoami
root
$ sudo users
user1
$ sudo groups
user1 adm cdrom sudo dip plugdev lpadmin
スクリプト
#!/bin/bash -x
echo $USER
echo $UID
id
logname
whoami
users
groups
$ sudo ./check.sh
+ echo root
root
+ echo 0
0
+ id
uid=0(root) gid=0(root) groups=0(root)
+ logname
user1
+ whoami
root
+ users
user1
+ groups
root
調査結果
出力されたユーザー名、所属グループ名は以下の通り。
手動でもスクリプト経由でも root
whoami
id
スクリプト経由なら root
- 環境変数 $USER
- 環境変数 $UID
groups
sudo 実行ユーザー
logname
users
使用例
例 1
管理者権限がない状態で実行してほしくないスクリプトがあるとき、ガード節として使う。
#!/bin/bash
if [ "`whoami`" != "root" ]; then
echo "Require root privilege"
exit 1
fi
cat <<EOT
- * - * - * - * - * - * - * - * -
- * HELLO, MY ROOT USER !!! * -
- * - * - * - * - * - * - * - * -
EOT
例 2
sudo を実行したユーザーによっては弾く。これもガード節。
#!/bin/bash
if [ "`whoami`" != "root" ]; then
echo "Require root privilege"
exit 1
fi
if [ "`logname`" = "user1" ]; then
for i in {1..10}
do
echo "Ha?"
done
exit 1
fi
cat <<EOT
* - * - * - * - * - * - * - * - * - *
* HELLO, MY CUTE ROOT USER !!!! *
* - * - * - * - * - * - * - * - * - *
EOT
感想
似たようなコマンドでも差がでて意外だった。
あと sudo
で一時的に振る舞うユーザーの環境変数は特別なことをしないと読み込まれないイメージだったけど、一旦実行ファイルを経由すれば読み込まれるのか、とこれも意外だった。
でも考えてみれば、子プロセスで新たにシェルを起動するわけだから、その初期動作として環境変数を読み直すのは当たり前のことかもしれない。
logname
は sudo su -
として root 化しても元のユーザーの名前が出力された。
コマンドの名前から察するに、このコマンドの目的はログインの根っこにいるユーザーを知ることなのかもしれない。 sudo
や su
コマンドでそれは書き変わらないんだろう。 whoami
や id
で出力内容が変わるのは、また別の情報を見ているんだろう。
なんとなく気にならなくて見てこなかった世界だ。
超・基本的なことなんだろうけど、なんだか勉強になった。