it-swarm-tr.com

Shell'in SSH'den kontrol edilip edilmediğini nasıl tespit edebilirim?

Bir SSH tarafından kontrol edilirse bir Shell script (daha spesifik olarak .zshrc) tespit etmek istiyorum. Host değişkenini denedim ama her zaman Shell'i çalıştıran bilgisayarın adı. SSH oturumunun geldiği ana bilgisayar adına erişebilir miyim? İkisini karşılaştırmak sorunumu çözerdi.

Her giriş yaptığımda, son giriş zamanını ve Ana Makineyi belirten bir mesaj var:

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

Bu, sunucunun bu bilgilere sahip olduğu anlamına gelir.

72
stribika

İşte ~/.profile:

  • Değişkenlerden biri SSH_CLIENT veya SSH_TTY tanımlı, bu bir ssh oturumu.
  • Giriş Shell'in üst işlem adı sshd ise, bu bir ssh oturumudur.
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

(Bunu neden oturum başlatmanız yerine Shell yapılandırmanızda test etmek istersiniz?)

SSH_TTY, SSH_CONNECTION veya SSH_CLIENT değişkenler.

23
Cakemox

Bash kullanarak Linux'ta da aynı problemi yaşadım. İlk olarak SSH_CONNECTION ortam değişkenini kullandım, ancak daha sonra su -.

Yukarıdaki son günlük çözümü su veya su - Sonrasında işe yaramadı.

Son olarak, SSH bağlantısı ise sonunda uzak IP'yi (veya ana bilgisayar adını) gösteren who am i Kullanıyorum. Sudan sonra da çalışır.

Bash düzenli ifadelerini kullanarak, bu işe yarar:

if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi

Eğer zsh düzenli ifadeleri desteklemiyorsa, aynı şey grep, cut, sed veya her neyse farklı şekillerde elde edilebilir.

Meraklı için, bunun için kullandığım şey, kök .bashrc'de:

    # 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 ile de çalışan bir alternatif, üst süreçler boyunca sshd'yi tekrar tekrar aramaktır:

#!/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 $?

İşlev .bashrc dosyasına eklenirse, if is_ssh; then ... Olarak kullanılabilir

10
mivk

Ortamınıza bir göz atıp doğru seçeneği bularak başlayın

printenv|grep SSH
SSH_CLIENT=192.168.1.xxx
SSH_CONNECTION=192.168.1.xxx
SSH_TTY=/dev/ttys021

Varlıklarına bağlı olarak belirli eylemleri tetiklemek için bu ortam değişkenlerinin çoğuna bağlanabilirsiniz.

2
lfender6445