Tôi chỉ gặp vấn đề tương tự trong Linux, sử dụng Bash. Lần đầu tiên tôi sử dụng biến môi trường SSH_CONNECTION, nhưng sau đó nhận ra rằng nó không được đặt nếu bạn su -
.
Giải pháp Lastlog ở trên không hoạt động sau su
hoặc su -
.
Cuối cùng, tôi đang sử dụng who am i
, hiển thị IP từ xa (hoặc tên máy chủ) ở cuối nếu đó là kết nối SSH. Nó cũng hoạt động sau khi su.
Sử dụng biểu thức chính quy Bash, công việc này:
if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi
Nếu zsh không hỗ trợ các biểu thức chính quy, điều tương tự có thể đạt được theo nhiều cách khác nhau với grep, cut, sed hoặc bất cứ điều gì.
Đối với người tò mò, bên dưới là những gì tôi sử dụng này cho, trong .bashrc của root:
# 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
Một thay thế cũng hoạt động với su
sẽ là tìm kiếm đệ quy sshd
thông qua các quy trình cha:
#!/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 $?
Nếu hàm được thêm vào .bashrc, nó có thể được sử dụng như if is_ssh; then ...