Linuxでプロセスのイニシエータの身元を確認するには、例えば、ユーザーtomがシステムにログインし、sudo su - rootに、その後スクリプトhey.shを実行し、hey.shのプロセスのイニシエータにさかのぼることは非常に簡単ではありませんユーザーtomは、それは非常に正確に行うのは簡単ではありません、それは私が比較的信頼性の高い方法を見つけるためにいくつかの時間がかかりました。
まず、遭遇したいくつかの問題から始めましょう:
- ユーザがログインし、sudo hey.shでhey.shを実行した場合、環境変数SUDO_USERからsudoユーザを取得することは可能ですが、上述のようにsudo suでユーザの環境変数を継承しない問題を解決する方法はありません。
- ttyコマンドで現在のプロセスの制御端末を取得し、制御端末ファイルの所有者でログインユーザーを確認することで、1の問題を解決することができます。しかし、現在のプロセスの親プロセスがデーモンであったり、標準入力がオフになっていたりすると、制御端末が存在しません。ターミナルがありません。
- proc/self/loginuidを読めば、現在のプロセスのログイン・ユーザーIDを取得できます。 制御端末を持たないプロセスのIDを取得することは可能ですが、デーモン・プロセスのIDは4294967295かもしれません。
#!/bin/bash
# A relatively reliable way to find process initiator on Linux
user_entry=`getent passwd $(cat /proc/self/loginuid)`
if [ $? -eq 0 ]; then
login_user=`echo ${user_entry} | cut -d: -f1`
else
login_user=${SUDO_USER:-${LOGNAME}}
if [ "${login_user}" = "" ]; then
login_user=`id -urn`
fi
fi
echo ${login_user}