У мене просто була така ж проблема в Linux, використовуючи Bash. Я спершу використав змінну середовища SSH_CONNECTION, але потім зрозумів, що вона не встановлена, якщо ви su -
.
Наведене вище рішення останнього журналу не працювало ні після, su
ні su -
.
Нарешті, я використовую who am i
, який показує віддалений IP (або ім'я хоста) наприкінці, якщо це з'єднання SSH. Він також працює після су.
Використовуючи регулярні вирази 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 ...