ログインユーザ名を取得する
su コマンドで root になった場合などで、 ログインしたときのユーザ名を取得する方法です。
結論から書くと、logname(1) を使えば良いです。
$ ssh ec2-user@ec2-host $ whoami ec2-user $ sudo su - $ whoami root $ logname ec2-user
Amazon Linux, CentOS 6, Ubuntu 14.04、Max OSX では期待通りの動作でした。
その他の方法
logname 以外にも幾つか方法があります。
SUDO_USER 環境変数
sudo su [ユーザ名]
で別のユーザになった場合は、
SUDO_USER
という環境変数にユーザ名が格納されます。
$ sudo su $ env | grep SUDO SUDO_USER=ec2-user SUDO_UID=500 SUDO_COMMAND=/bin/su SUDO_GID=500
他にも UID や GID も取れるようです。
ただ、これはログインしたユーザ名を取るのではなく、
sudo したユーザ名を取るので、
root になって更に別のユーザになった場合などはログインユーザ名を取れません。
$ whoami ec2-user $ sudo su $ echo $SUDO_USER ec2-user $ sudo su ec2-user $ echo $SUDO_USER root
また、sudo su - [ユーザ名]
とした場合は、
su したあとのシェルがログインシェルになってしまうためか、
SUDO_USER などが設定されていませんでした。
$ sudo su - $ env | grep SUDO
SUDO_USER
は sudo したユーザ名を取る用途以外に使わないほうが良さそうです。
who am i (who -m) を使う
whoami(1) は現在のユーザ名を取得するコマンドですが、
who am i(who -m)
は
-m only hostname and user associated with stdin
となります(who(1))。
実際に実行してみると、以下のようになります。
$ who am i ec2-user pts/0 2015-07-28 02:01 (ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com)
man によると、
If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.
ということですので、引数を2つ与えると who -m
を実行するようです(who foo bar
などでも動作しました)。
こちらは SUDO_USER
と違って、cut や awk で切り出せばログインユーザ名を取得できますが、
Mac OSX ではログインユーザ名を取得できませんでした。
man を見てみると、
-m Only print information about the current terminal. This is the POSIX way of saying who am i.
となっています。
実際に実行してみると、
$ whoami tkuchiki $ sudo su - $ who am i root ttys001 Jul 28 11:49
のようになります。
FreeBSD Man Pages の who(1) を見ると、
-m Show information about the terminal attached to standard input only.
となっているので、FreeBSD だといけるのかもしれません(未検証)。
おまけ
getlogin works on debian but not ubuntu? を見ていると、
getlogin
か getpwuid
でログインユーザ名が取れるそうです。
同名のライブラリ関数があるので、色々な言語にも同等の機能を持った関数がありそうです。
まとめ
SUDO_USER
は sudo したユーザ名を取る用途以外に使わないほうが良さそう- who am i は環境によっては意図した動作にならない
logname
を使える環境であればlogname
を使うのが楽そう