Saya baru saja mengalami masalah yang sama di Linux, menggunakan Bash. Saya pertama kali menggunakan variabel lingkungan SSH_CONNECTION, tetapi kemudian menyadari bahwa itu tidak disetel jika Anda su -
.
Solusi lastlog di atas tidak berfungsi baik setelah su
atau su -
.
Akhirnya, saya menggunakan who am i
, yang menunjukkan IP jarak jauh (atau nama host) pada akhirnya jika itu koneksi SSH. Ini juga berfungsi setelah su.
Menggunakan ekspresi reguler Bash, ini berfungsi:
if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi
Jika zsh tidak mendukung ekspresi reguler, hal yang sama dapat dicapai dengan berbagai cara dengan grep, cut, sed, atau apa pun.
Bagi yang penasaran, di bawah ini saya gunakan untuk apa, di root .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
Alternatif yang juga berfungsi su
adalah mencari secara rekursif sshd
melalui proses induk:
#!/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 $?
Jika fungsi ditambahkan ke .bashrc, ini dapat digunakan sebagai if is_ssh; then ...