現在、シェルセッションがログインセッション内で実行されていることを確認しようとしていますsu
。
この状況をテストする最良の方法は何ですか?
答え1
logname
コマンドを表示します。 logname は、utmp ログで提供されているように、制御端末にログインしたユーザーのユーザー名を印刷します。
tk-mbp:~ tkennedy$ id -g -rn
staff
tk-mbp:~ tkennedy$ id -u -rn
tkennedy
tk-mbp:~ tkennedy$ logname
tkennedy
tk-mbp:~ tkennedy$ su -
Password:
tk-mbp:~ root# id -g -rn
wheel
tk-mbp:~ root# id -u -rn
root
tk-mbp:~ root# logname
tkennedy
この例はMac OS Xからのものであるため、コマンドの使用はid
他のオペレーティングシステムと異なる場合がありますが、ログ名の使用はMac OS間で一貫しています。
lognameを使用すると、コマンドによって返されたユーザーが次のようになると想定できますid
。いいえ返されたユーザーと同じlogname
場合、現在のシェルセッションは、su、sudo、またはシェルで権限の変更を許可する他のツールで実行されています。
答え2
現在のシェルが実行されているかどうかをテストするには、次の手順を実行しますsu
。
[ "$(ps -o comm= $PPID)" = "su" ]
su
ログイン後にユーザーが呼び出すかどうかをテストするには、多くの(すべてではない)システムで(LOGNAME
通常は初期ログイン時に設定)USER
または(現在のユーザーを識別します)とid -un
比較できます。これはLOGNAME
簡単に欺くことができます(環境変数です)。ただし、他のソリューションの場合も同様です(たとえば、すべてのソリューションはln -s /bin/su ~/sh; ~/sh
プロセス名によって隠されます)。su
答え3
私が接続したソリューションの1つは次のとおりです。
pstree -p $$ |
grep -oP '[r]oot su .*(\w+)' |
sed -n -E 's/.* ([[:alnum:]]+)$/\1/p'`
木現在のシェルプロセスPID($ $)の祖先ツリーを一覧表示するには、-pフラグを使用します。
grep"root su"を含む行を見つけます。 (私はgrepプロセス自体を返さないために[r]トリックを使います。)
sed結果をクリーンアップし、行の末尾に現在のユーザー名のみを印刷します。 (親プロセスのユーザーを出力する場合はさらに役立つでしょう。)