it-swarm-vi.com

Làm cách nào tôi có thể phát hiện nếu Shell được kiểm soát từ SSH?

Tôi muốn phát hiện từ tập lệnh Shell (cụ thể hơn .zshrc) nếu nó được điều khiển thông qua SSH. Tôi đã thử biến Host nhưng nó luôn là tên của máy tính đang chạy Shell. Tôi có thể truy cập tên máy chủ nơi phiên SSH đến không? So sánh hai sẽ giải quyết vấn đề của tôi.

Mỗi lần tôi đăng nhập, có một thông báo cho biết lần đăng nhập cuối cùng và Máy chủ lưu trữ:

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

Điều này có nghĩa là máy chủ có thông tin này.

72
stribika

Dưới đây là các tiêu chí tôi sử dụng trong ~/.profile:

  • Nếu một trong các biến SSH_CLIENT Hoặc SSH_TTY Được xác định, đó là phiên ssh.
  • Nếu tên tiến trình cha của Shell đăng nhập là sshd, thì đó là phiên 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

(Tại sao bạn muốn kiểm tra điều này trong cấu hình Shell thay vì khởi động phiên của bạn?)

Bạn sẽ có thể kiểm tra thông qua SSH_TTY, SSH_CONNECTION, hoặc là SSH_CLIENT biến.

23
Cakemox

Tôi chỉ gặp vấn đề tương tự trong Linux, sử dụng Bash. Lần đầu tiên tôi sử dụng biến môi trường SSH_CONNECTION, nhưng sau đó nhận ra rằng nó không được đặt nếu bạn su -.

Giải pháp Lastlog ở trên không hoạt động sau su hoặc su -.

Cuối cùng, tôi đang sử dụng who am i, hiển thị IP từ xa (hoặc tên máy chủ) ở cuối nếu đó là kết nối SSH. Nó cũng hoạt động sau khi su.

Sử dụng biểu thức chính quy Bash, công việc này:

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

Nếu zsh không hỗ trợ các biểu thức chính quy, điều tương tự có thể đạt được theo nhiều cách khác nhau với grep, cut, sed hoặc bất cứ điều gì.

Đối với người tò mò, bên dưới là những gì tôi sử dụng này cho, trong .bashrc của root:

    # 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

Một thay thế cũng hoạt động với su sẽ là tìm kiếm đệ quy cho sshd thông qua các quy trình cha:

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

Nếu chức năng được thêm vào .bashrc, nó có thể được sử dụng làm if is_ssh; then ...

10
mivk

Bắt đầu bằng cách xem xét môi trường của bạn và tìm ra lựa chọn phù hợp

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

Bạn có thể nối vào nhiều biến môi trường này để kích hoạt các hành động cụ thể dựa trên sự hiện diện của chúng.

2
lfender6445