tkuchikiの日記

新ブログ https://blog.tkuchiki.net

ログインユーザ名を取得する

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? を見ていると、
getlogingetpwuid でログインユーザ名が取れるそうです。
同名のライブラリ関数があるので、色々な言語にも同等の機能を持った関数がありそうです。

まとめ

  • SUDO_USER は sudo したユーザ名を取る用途以外に使わないほうが良さそう
  • who am i は環境によっては意図した動作にならない
  • logname を使える環境であれば logname を使うのが楽そう