Як визначити, чи я ввійшов через SSH?


17

Наразі я створюю досить складну конфігурацію bash, яка повинна використовуватися на декількох машинах. Я намагаюся з’ясувати, чи можна визначити, чи я увійшов через SSH чи на локальній машині. Таким чином, я міг би, наприклад, встановити деякі псевдоніми залежно від цього факту. Як альясінг haltдо restartтак зупинити віддалений сервер не може бути краще за все зробити.

Я знаю досі, що змінна середовища SSH_CLIENTвстановлюється, коли я входив через ssh. На жаль, ця змінна відміняється, коли я запускаю оболонку супер користувача sudo -s. Я також знаю, що я можу передати параметр sudo, який вказує sudo копіювати всі мої змінні середовища в нове середовище оболонки, але якщо я не хочу цього робити, чи є інший спосіб?

Відповіді:


14

Ви можете використовувати команду "w" або "who". Коли ви підключитесь через ssh, вони покажуть ваш вихідний IP-адресу.


1
Складіть освічені здогадки. Наприклад, запустіть, ps afxа TTY для оболонки, що не працює, psбуде іншим логіном.
Warner

6
Використовуйте who am i.
Пол Томблін

1
"uname -n" дасть вам ім'я господаря
Hubert Kario

1
Здається, питання більше пов'язане з його вилученням who am i, щоб ви могли звідти визначити, ви SSHing чи ні. Це працює:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
синій

4
@PaulTomblin Насправді ви можете використовувати whoбудь-які два додаткові аргументи. who am iте саме, що who is meабо who is awesomeабо who potato potato. Факт, який мені здався трохи цікавим.
kirkpatt

9

Ось чудова відповідь, яку я знайшов на unix.stackexchange :


  • Якщо одна із змінних SSH_CLIENT абоSSH_TTY визначена, це сеанс ssh.
  • Можна перевірити батьківський процес оболонки входу ps -o comm= -p $PPID. Якщо це так sshd, це ssh сесія.
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
  SESSION_TYPE=remote/ssh
else
  case $(ps -o comm= -p $PPID) in
    sshd|*/sshd) SESSION_TYPE=remote/ssh;;
  esac
fi

Не працює для sudo -s
Метт


4

Якщо ви хочете дізнатись, чи ви атакуєте оболонку безпосередньо дочірнім процесом sshd (не n> 1 шаром глибиною), ви можете

cat / proc / $ PPID / статус | голова -1 | вирізати -f2

він повинен дати вам sshdабо будь-що, що називає батьківський процес вашої поточної оболонки.


Не працює для sudo -s
Метт

ps -o cmd= $PPIDабоawk '/^Name:/ {print $2}' /proc/$PPID/status
Шість

3

Я думаю, ти хочеш переосмислити те, як ти думаєш про проблему. Питання не в тому, "чи я входив через SSH, тому що хочу вимкнути певні команди". Це "я ввійшов у консоль, тому що тоді я ввімкну певні команди".


3

Так, як зазначали інші, інформація знаходиться у присутності вашого IP в дужках на виході who am i .

Ви можете використовувати регулярні вирази Bash для його виявлення:

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

1
Це також може бути ім'я хоста.
синенький

Не працює, якщо ім'я хоста містить цифри.
YoYoYonnY

1

Я придумав наступне, спираючись на поради інших людей.

Він використовує змінну для кешування - я використовую її в темі оболонки.

is_ssh() {
    (( $+SSH_CLIENT )) && return
    if ! (( $+_ZSH_IS_SSH )); then
        # "who am i" displays current user from utmp(5).  This will be empty for
        # a "normal" terminal.  With Konsole, it is ":0" for display :0,
        # for ssh it is the hostname and with tmux sth like "tmux(PID).ID".
        local whoami="$(who am i)"}
        local host="${whoami#*\(*}"
        [[ -n $host && $host != tmux* && $host != :* ]]
        _ZSH_IS_SSH=$?
    fi
    return $_ZSH_IS_SSH
}

Джерело: is_sshу https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63 .


0

Шукайте батьківський виразок cmdline і повторіть його. Можливо, щось таке:

#!/usr/bin/env bash

## Find out how I'm logged in
# Tested on RHEL5.5

PD=${1:-$$}
ME=`basename $0`

## Read the shell's PPID
PAR=`ps --no-headers -p $PD -o ppid`

## CMDLINE can contain stuff like the following:
# /sbin/getty-838400tty4 // logged in at a console
# gnome-terminal         // logged in Gnome Terminal
# -bash                  // in a subshell
# su-                    // we became another user using su
# sshd: jc@pts/1         // logged in over ssh
# login                  // logged in terminal or serial device

eval `python - << __EOF__
import re
f = open("/proc/${PAR}/cmdline", 'r')
ln = f.readline()
if re.search(r'^ssh', ln): 
    print "echo Logged in via ssh"
if re.search(r'getty.*?tty', ln):
    print "echo Logged in console"
if re.search("gnome-terminal", ln):
    print "echo Logged in Gnome"
if re.search(r'^login', ln):
    print "echo Logged in console"
if re.search(r'^-?bash', ln) or re.search(r'^su', ln): 
    print "./$ME $PAR"
f.close()
__EOF__
`

Відредаговано так, щоб це справді працювало :)


0

Усі інші відповіді працюють, якщо ви знаходитесь на першому рівні входу. Але якщо після входу ви запускаєте "su" або "sudo" (у моєму випадку для переходу на акаунт користувача без оболонки з міркувань безпеки я повинен був запустити: sudo su - <userid> -s / bin / bash - л) , їх рішення не вдається.

Далі йде універсальне рішення; використовуючи pstree, ви перевіряєте наявність sshd як батьків.

if pstree -p | egrep --quiet --extended-regexp ".*sshd.*\($$\)"; then
  echo "I am remote."
else
  echo "I am local."
fi

Ось висновок egrep, коли --quiet видаляється. Він показує всю ієрархію, яка відповідає, якщо вона підключена віддалено.

   |            |-sshd(18599)---sshd(18603)---bash(18604)---sudo(18823)---bash(18824)-+-egrep(22417)

0

Будь ласка, майте на увазі, що ця відповідь дуже, дуже специфічна для Linux.

parent_pid=$$
while [[ -z "${tty_bits-}" || $tty_bits -ne 0 ]]; do
  read initiator_name parent_pid tty_bits < <(
    awk '{ print substr($2, 2, length($2) - 2) " " $4 " " $7 }' /proc/$parent_pid/stat
  )
done

echo $initiator_name

Це робить основне припущення: процес входу не матиме керуючого TTY; ви, мабуть, хочете перевірити, чи є у вас у вас контрольний TTY перед тим, як запустити цей код (який, виходячи з ваших вимог, все-таки є безпечною ставкою, все одно).

Код повторюється вгору через дерево процесу, поки не знайде процес, який не має керуючого TTY. $initiator_nameбуде ім'я цього процесу (наприклад, "sshd").

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.