Как я могу обнаружить, если оболочкой управляют от SSH?

На *BSD:

date -r 1234567890

На Linux (а именно, с GNU coreutils ≥5.3):

date -d @1234567890

С более старыми версиями даты GNU можно вычислить относительную разницу для эпохи UTC:

date -d '1970-01-01 UTC + 1234567890 seconds'

При необходимости в мобильности Вам не повезло. Единственное время, которое можно отформатировать с командой оболочки POSIX (не делая вычисления сами) строка, является текущим временем. На практике Perl часто доступен:

perl -le 'print scalar localtime $ARGV[0]' 1234567890
71
19.03.2011, 00:19
6 ответов

Вот критерии, которые я использую в моем ~/.profile:

  • Если одна из переменных SSH_CLIENT или SSH_TTY определяется, это - ssh сессия.
  • Если имя родительского процесса оболочки входа в систему sshd, это - 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

(Почему Вы хотели бы протестировать это в своей конфигурации оболочки, а не своем запуске сессии?)

92
27.01.2020, 19:31
  • 1
    Работавший отлично Спасибо! github.com/balupton/dotfiles/commit / … –  balupton 06.11.2013, 08:52
  • 2
    Вы могли бы хотеть сделать это в своей конфигурации оболочки, если Вы хотите включить ssh передачу агента из своей удаленной оболочки (так как среда Вар должна быть установлена в каждой оболочке, от которой Вы хотите передать), если я не пропускаю что-то? –  underrun 14.04.2014, 19:31
  • 3
    @underrun я не понимаю Вашу точку. При выполнении другой оболочки на той же сессии она наследовала переменные среды, установленные .profile. И что это имеет отношение к передаче агента? –  Gilles 'SO- stop being evil' 14.04.2014, 23:41
  • 4
    @underrun, Если Вы хотите протестировать на присутствие передачи агента SSH, теста для SSH_AUTH_SOCK переменная. Но почему Вы выполнили бы агент SSH в этом случае? Вы имеете в виду, запускают агент, если Вы зарегистрированы без передачи агента? Почему бы не запустить агент, если уже нет одного ([ -n "$SSH_AUTH_SOCK" ] || eval $(ssh-agent))? использование –  Gilles 'SO- stop being evil' 15.04.2014, 22:11
  • 5
    @Praxeolitic SSH_* переменные также установлены в подпроцессах оболочки, которая это во главе сессии SSH, например, если Вы запускаете экранную сессию по SSH (необходимо сбросить переменные прежде, чем запустить сессию, если Вы заботитесь). Я думаю, что причина тестирования родительского процесса состоит в том, что я начал делать это, прежде чем sshd определил любые переменные среды. –  Gilles 'SO- stop being evil' 07.03.2017, 23:02

Необходимо смочь проверить через SSH_TTY, SSH_CONNECTION, или SSH_CLIENT переменные.

22
27.01.2020, 19:31
  • 1
    Также добавьте их к env_keep в sudoers заставить его работать через su команды:) –  Thomas G. 31.03.2016, 20:00

У меня просто была та же проблема в Linux, с помощью Bash. Я сначала использовал переменную среды SSH_CONNECTION, но затем понял, что это не установлено если Вы su -.

lastlog решение выше не работало ни один после su или su -.

Наконец, я использую who am i, который показывает удаленный IP (или имя хоста) в конце, если это - соединение SSH. Это также работает после su.

Используя регулярные выражения Bash, это работает:

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

Если zsh не поддерживает регулярные выражения, то же может быть достигнуто по-разному с grep, сокращено, sed, или что бы то ни было.

Для любопытного, ниже то, что я использую это для в .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

Альтернатива, которая также работает с su должен был бы рекурсивно искать 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 $?

Если функция добавляется к .bashrc, она может использоваться как if is_ssh; then ...

10
27.01.2020, 19:31
  • 1
    не работает в удаленном tmux сессии и также имеют проблемы, если зарегистрировано на пути, IPv6 и никакое имя реверса DNS существуют. большое спасибо –  bene 10.02.2013, 18:58
  • 2
    @bene: что не работает? Регулярное выражение, или делает who am i не показывают Ваш адрес IPv6? –  mivk 10.02.2013, 21:08
  • 3
    1) who am i ничего не возвращает в удаленном tmux сессия. 2) адрес IPv6 мог бы содержать двоеточия, которые не позволяет Ваш regex. Это могло бы быть хитро с тех пор who am i содержит (:0.0) на X сессиях для меня (xterm). Linux Mint –  bene 11.02.2013, 17:05
  • 4
    @bene: альтернативное решение, которое я просто добавил, должно также работать с IPv6. Я не знаю о tmux, но он действительно также работает в screen. –  mivk 15.12.2013, 16:54

Я думаю, Gilles и ответы Cakemox хороши, но только для полноты...

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

прибывает из pam_lastlog1.

Можно распечатать pam_lastlog информация с помощью lastlog2 команды, например.

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

для локального входа в систему, по сравнению с

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

для входа в систему SSH.

В моей системе это работает для извлечения его

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

last и w могло быть полезным также, например

$ 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 для pam_lastlog.
2 Linux/FreeBSD lastlog(8) страницы справочника.
8
27.01.2020, 19:31

Начните с точки зрения вашей среды и нахождение правильного варианта

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

. Вы можете подключить многие из этих переменных среды, чтобы вызвать конкретные действия, основанные на их присутствии.

1
27.01.2020, 19:31

Это проверка всех установленных соединений от другого пользователя с использованием SSH

netstat | grep ssh
-1
27.01.2020, 19:31

Теги

Похожие вопросы