LinuxでもBashを使用して同じ問題が発生しました。最初に環境変数SSH_CONNECTIONを使用しましたが、次に設定した場合は設定されないことに気付きましたsu -
。
上記のlastlogソリューションは、su
またはの後でも機能しませんでしたsu -
。
最後に、who am i
SSH接続の場合、最後にリモートIP(またはホスト名)を表示するを使用しています。suの後でも動作します。
Bash正規表現を使用すると、これは機能します。
if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi
zshが正規表現をサポートしていない場合、grep、cut、sedなど、さまざまな方法で同じことが実現できます。
好奇心のために、以下はルートの.bashrcでこれを使用するものです:
# We don't allow root login over ssh.
# To enable root X forwarding if we are logged in over SSH,
# use the .Xauthority file of the user who did su
w=$(who am i)
if [[ $w =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then
olduser=${w/ .*/}
oldhome=$(getent passwd $olduser | cut -d: -f 6)
[ -f "$oldhome/.Xauthority" ] \
&& export XAUTHORITY=$oldhome/.Xauthority
fi
これも機能する代替手段は、親プロセスsu
を再帰的に検索することsshd
です。
#!/bin/bash
function is_ssh() {
p=${1:-$PPID}
read pid name x ppid y < <( cat /proc/$p/stat )
# or: read pid name ppid < <(ps -o pid= -o comm= -o ppid= -p $p)
[[ "$name" =~ sshd ]] && { echo "Is SSH : $pid $name"; return 0; }
[ "$ppid" -le 1 ] && { echo "Adam is $pid $name"; return 1; }
is_ssh $ppid
}
is_ssh $PPID
exit $?
関数を.bashrcに追加すると、次のように使用できます。 if is_ssh; then ...