쉘이 SSH에 의해 제어되는지 어떻게 감지합니까?

쉘이 SSH에 의해 제어되는지 어떻게 감지합니까?

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 iSSH 연결인 경우 끝에 원격 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

이러한 환경 변수 중 다수를 연결하여 존재 여부에 따라 특정 작업을 트리거할 수 있습니다.

관련 정보