it-swarm-id.com

Bagaimana saya bisa mendeteksi jika Shell dikendalikan dari SSH?

Saya ingin mendeteksi dari skrip Shell (lebih khusus. Zshrc) jika dikendalikan melalui SSH. Saya mencoba variabel Host tetapi selalu nama komputer yang menjalankan Shell. Bisakah saya mengakses nama host tempat sesi SSH berasal? Membandingkan keduanya akan menyelesaikan masalah saya.

Setiap kali saya masuk ada pesan yang menyatakan waktu masuk terakhir dan Host:

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

Ini berarti server memiliki informasi ini.

72
stribika

Berikut adalah kriteria yang saya gunakan dalam ~/.profile Saya:

  • Jika salah satu variabel SSH_CLIENT Atau SSH_TTY Didefinisikan, ini adalah sesi ssh.
  • Jika nama proses induk Shell yang masuk adalah sshd, ini adalah sesi 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

(Mengapa Anda ingin menguji ini dalam konfigurasi Shell Anda daripada memulai sesi Anda?)

Anda harus dapat memeriksa melalui SSH_TTY, SSH_CONNECTION, atau SSH_CLIENT variabel.

23
Cakemox

Saya baru saja mengalami masalah yang sama di Linux, menggunakan Bash. Saya pertama kali menggunakan variabel lingkungan SSH_CONNECTION, tetapi kemudian menyadari bahwa itu tidak disetel jika Anda su -.

Solusi lastlog di atas tidak berfungsi baik setelah su atau su -.

Akhirnya, saya menggunakan who am i, yang menunjukkan IP jarak jauh (atau nama host) di bagian akhir jika itu adalah koneksi SSH. Ini juga berfungsi setelah su.

Menggunakan ekspresi reguler Bash, ini berfungsi:

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

Jika zsh tidak mendukung ekspresi reguler, hal yang sama dapat dicapai dengan berbagai cara dengan grep, cut, sed, atau apa pun.

Bagi yang penasaran, di bawah ini saya gunakan untuk apa, di root .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

Alternatif yang juga berfungsi dengan su adalah mencari secara rekursif untuk sshd melalui proses induk:

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

Jika fungsi ditambahkan ke .bashrc, itu dapat digunakan sebagai if is_ssh; then ...

10
mivk

Mulailah dengan melihat lingkungan Anda dan menemukan opsi yang tepat

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

Anda bisa menghubungkan ke banyak variabel lingkungan ini untuk memicu tindakan spesifik berdasarkan keberadaannya.

2
lfender6445