ฉันเพิ่งมีปัญหาเดียวกันใน Linux โดยใช้ Bash ครั้งแรกที่ผมใช้ในสภาพแวดล้อม SSH_CONNECTION ตัวแปร su -
แต่แล้วก็รู้ว่ามันไม่ได้ตั้งค่าถ้าคุณ
การแก้ปัญหาดังกล่าวข้างต้น lastlog ไม่ได้ทั้งหลังหรือsu
su -
ในที่สุดฉันกำลังใช้who am i
ซึ่งแสดง IP ระยะไกล (หรือชื่อโฮสต์) ที่ท้ายถ้าเป็นการเชื่อมต่อ SSH นอกจากนี้ยังใช้งานได้หลังจาก 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 ...