SSH를 통해 제어되는지 여부를 쉘 스크립트(더 구체적으로 .zshrc)에서 감지하고 싶습니다. HOST 변수를 시도했지만 항상 셸이 실행 중인 컴퓨터의 이름입니다. SSH 세션이 시작된 호스트 이름에 액세스할 수 있나요? 두 가지를 비교하면 내 문제가 해결되었습니다.
로그인할 때마다 마지막 로그인 시간과 호스트를 알려주는 메시지가 나타납니다.
Last login: Fri Mar 18 23:07:28 CET 2011 from max on pts/1
Last login: Fri Mar 18 23:11:56 2011 from max
이는 서버에 이 정보가 있음을 의미합니다.
답변1
제가 사용하는 기준은 다음과 같습니다 ~/.profile
.
- 변수 중 하나
SSH_CLIENT
가 정의되어 있으면 SSH 세션입니다.SSH_TTY
- 로그인 셸의 상위 프로세스 이름이
sshd
이면 SSH 세션입니다.
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
SESSION_TYPE=remote/ssh
# many other tests omitted
else
case $(ps -o comm= -p "$PPID") in
sshd|*/sshd) SESSION_TYPE=remote/ssh;;
esac
fi
(세션 시작 대신 쉘 구성에서 이것을 테스트하는 이유는 무엇입니까?)
답변2
SSH_TTY
, SSH_CONNECTION
또는 변수를 통해 SSH_CLIENT
확인할 수 있어야 합니다 .
답변3
방금 Linux에서 Bash를 사용하여 동일한 문제에 직면했습니다. 처음에는 환경 변수 SSH_CONNECTION을 사용했지만 su -
.
su
위의 Lastlog 솔루션은 전후에 작동하지 않습니다 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 ...
답변4
먼저 귀하의 환경을 살펴보고 올바른 선택을 찾으십시오
printenv|grep SSH
SSH_CLIENT=192.168.1.xxx
SSH_CONNECTION=192.168.1.xxx
SSH_TTY=/dev/ttys021
이러한 환경 변수 중 다수를 연결하여 존재 여부에 따라 특정 작업을 트리거할 수 있습니다.