Kabuğun SSH'den kontrol edilip edilmediğini nasıl tespit edebilirim?


69

SSH ile kontrol ediliyorsa, bir kabuk betiğinden (daha spesifik olarak .zshrc) tespit etmek istiyorum. HOST değişkenini denedim, ancak her zaman kabuğu çalıştıran bilgisayarın adıdır. SSH oturumunun geldiği ana bilgisayar adına erişebilir miyim? İkisini karşılaştırmak sorunumu çözerdi.

Her giriş yaptığımda, son giriş saatini ve sunucuyu 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 bilgiye sahip olduğu anlamına gelir.

Yanıtlar:


90

İşte benim kullandığım kriterler ~/.profile:

  • Değişkenlerden biri SSH_CLIENTveya SSH_TTYtanımlanmışsa, bu bir ssh oturumu.
  • Giriş kabuğunun üst işlem adı ise sshd, bu bir ssh oturumu.
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

(Neden bunu oturum açılışı yerine kabuk yapılandırmanızda test etmek istiyorsunuz?)


3
Harika çalıştı, teşekkürler! github.com/balupton/dotfiles/commit/…
balupton

1
Eğer bir şeyleri kaçırmadığım sürece, uzak kabuğunuzdan ssh aracısının yönlendirilmesini etkinleştirmek istiyorsanız (ortamın değişmesi gereken her bir kabuğa ayarlanması gerektiğinden) bunu yapmak isteyebilirsiniz.
underrun

@ underrun Amacınızı anlamıyorum. Aynı oturumda başka bir kabuk çalıştırırsanız, ayarlanan ortam değişkenlerini devralır .profile. Bunun ajan yönlendirmeyle ne ilgisi var?
Gilles

1
@underrun SSH aracısı yönlendirmesinin varlığını test etmek istiyorsanız, SSH_AUTH_SOCKdeğişkeni test edin . Ama neden bu durumda bir SSH ajanı yönettin? Ajan iletmeden giriş yaptıysanız, bir acenteye başlamak mı istediniz? Önceden bir ( [ -n "$SSH_AUTH_SOCK" ] || eval $(ssh-agent)) yoksa neden bir aracı başlatmıyorsunuz ?
Gilles

1
@Praxeolitic SSH_*Değişkenler ayrıca bir SSH oturumunun başındaki bir kabuğun alt işlemlerinde de ayarlanmıştır, örneğin SSH üzerinden bir ekran oturumu başlatırsanız (eğer ilgileniyorsanız oturuma başlamadan önce değişkenleri ayarlamalısınız). Ana işlemi sınamanın nedeni, sshd'nin herhangi bir ortam değişkenini tanımlamasından önce bunu yapmaya başladığımdır.
Gilles

21

Sen aracılığıyla kontrol etmek gerekir SSH_TTY, SSH_CONNECTIONya da SSH_CLIENTdeğişkenler.


1
Bunları komutlar env_keeparasında sudoersçalışmasını sağlamak için de ekleyin su:)
Thomas G.

10

Aynı problemi Linux'ta da Bash kullanarak yaşadım. Öncelikle SSH_CONNECTION ortam değişkenini kullandım, ancak sonra eğer ayarlanmadığını fark ettim su -.

Lastlog çözüm Yukarıdaki sonra da işe yaramadı suya su -.

Sonunda, who am ieğer SSH bağlantısı varsa, sonunda uzak IP'yi (veya ana bilgisayar adını) gösteren kullanıyorum . Aynı zamanda 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

Zsh normal ifadeleri desteklemiyorsa, aynı grep, cut, sed veya her neyse farklı şekillerde elde edilebilir.

Meraklı için, aşağıda root'un .bashrc'sinde kullandığım şey:

    # 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

Aynı zamanda birlikte çalışan bir alternatif , üst süreçler boyunca sutekrar tekrar aramak olacaktır 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 $?

Eğer işlev .bashrc'ye eklenirse, olarak kullanılabilir. if is_ssh; then ...


1
uzak tmuxoturumlarda çalışmaz ve IPv6 aracılığıyla giriş yaptıysanız ve DNS ters adı yoksa sorun yaşar.
Bene

@bene: ne işe yaramıyor? Normal ifade veya who am iIPv6 adresinizi göstermiyor mu?
mivk

1) who am iuzaktaki bir tmuxoturumda hiçbir şey döndürmez . 2) IPv6 adresi, regex'in izin vermediği virgül içerebilir. Bu benim için X seanslarını who am iiçerdiği için zor olabilir (:0.0)(xterm).
bene

@bene: Yeni eklediğim alternatif çözüm IPv6 ile de çalışmalı. Tmux'u bilmiyorum, ama aynı zamanda işe yarıyor screen.
mivk

7

Gilles ve Cakemox'un cevaplarının iyi olduğunu düşünüyorum, ama sadece bütünlüğü için ...

Last login: Fri Mar 18 23:07:28 CET 2011 from max on pts/1

pam_lastlog1 den geliyor .

Örneğin 2 komutunu pam_lastlogkullanarak bilgi yazdırabilirsiniz.lastlog

$ lastlog -u mikel  
Username         Port     From             Latest
mikel            tty1                      Fri Jan 28 10:58:10 +1100 2011

yerel bir giriş için, karşılaştırıldığında

Username         Port     From             Latest
mikel            pts/9    mikel-laptop     Sat Mar 19 11:11:58 +1100 2011

SSH girişi için.

Benim sistemimde, bu onu çıkarmak için çalışır.

$ lastlog -u mikel | sed -ne '2{p;q}' | cut -c 27-42
mikel-laptop 

lastve wbelki de yardımcı olabilir

$ TTY=$(tty)
$ last -n 1 ${TTY#/dev/} | sed -ne '1{p;q}'
mikel    pts/12       :0.0             Sat Mar 19 11:29   still logged in 


1 Linux / FreeBSD belgeleri pam_lastlog.
2 Linux / FreeBSD lastlog(8) kullanıcı sayfası.


1

Ortamınıza bir göz atarak ve 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.


-1

Bu, SSH kullanarak diğer tüm kullanıcılardan kurulan tüm bağlantıların kontrol edilmesidir.

netstat | grep ssh

Bu hiç güvenilir değil.
DannyNiu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.