SU(スイッチユーザー)後にログインユーザ名をコマンド取得する
投稿者:しんさん 2016/03/19

SU後にログインユーザのユーザ名を取得したい
UNIX系のOSを使用する際、頻繁に別のユーザにsuする機会があります。
自身のユーザ名であればwhoamiコマンドで取得することができますが、
- ログイン時に使用したユーザ名を使用したい
というケースも存在します。
例えば、SUしている状態で
- ログインユーザの権限を使用して他のサーバへscp/ssh等を実施したい。
- ログファイル名や作業用のディレクリ名に使用したい。
- コピーしたログファイル等をログインユーザの権限で取得できるようにchownしたい
といったケースがこれに該当します。
これを実現するための方法の一つとして、who -mコマンドを使用する方法がシンプルです。
[user@testsv0 ~]$ who -m
user pts/2 Feb 22 17:44 (48.66.32.222)
[user@testsv0 ~]$ who -m |awk '{print $1}'
user
[user@testsv0 ~]$ ssh `who -m |awk '{print $1}'`@testsv1
■SUした後でもログインユーザ名を取得する事ができる
[user@testsv0 ~]$ sudo su - root
[root@testsv ~]# who -m
user pts/2 2016-02-22 17:44 (48.66.32.222)
[root@testsv ~]# who -m |awk '{print $1}'
user
[root@testsv ~]# ssh `who -m |awk '{print $1}'`@testsv1
scriptコマンド実行時の制約
ただし、上記のwho -mコマンドを使用した方法が使用できないケースがあります。
それが、
- AIXにてscriptコマンド実行後にSUした場合
です。
user@testsv3[/prustaff/user]>script script.log
script コマンドを開始します。 ファイルは script.log です。
user@testsv3[/prustaff/user]>who -m
user pts/22
user@testsv3[/prustaff/user]>sudo su -
[root@testsv3 ~]# who -m
root pts/22
上記の例でも、who -mの結果がrootユーザになっています。
※私が検証した限りでは、Linuxではログインユーザー名を取得できました。
AIXかつscript実行化でもなんとかしてログインユーザー名を取得したい
このように、AIXにてscriptコマンドを実行して実行ログを取っている時でも、scriptコマンドを発行したユーザがログインユーザであれば、ログインユーザ名を取得する方法があります。
それが、
- ttyのオーナー情報から取得する
という方法です。
■スクリプトコマンド実行中のためwho -mではログインユーザ名が取得できない
[root@testsv3 ~]# who -m
root pts/22
■一方でttyコマンドの結果表示されるttyはscriptコマンド発行時のユーザになる
[root@testsv3 ~]# tty
/dev/pts/22
[root@testsv3 ~]# ls -l /dev/pts/22
crw--w--w- 1 user staff 19, 22 Feb 22 17:58 /dev/pts/22
■awkで整形して、ユーザ名だけを切り出して利用できる
[root@testsv3 ~]# ls -l $(tty)|awk '{print $3}'
user
[root@testsv3 ~]# ssh `ls -l $(tty)|awk '{print $3}'`@testsv1
注意点
scriptコマンドがログインユーザ以外で発行された場合には、上記ttyを使用した手法はとれませんのでご注意ください。
scriptを誰が発行して取得したものなのか
が後でわかりやすくするためにも、suする前にscriptコマンドを発行するのが良いでしょう。scriptで取得した実行ログ自体のファイルがログインユーザーのIDとなっていた方が後で何かあった場合のトレーサビリティが高いためです。