Я хочу определить из сценария оболочки (точнее, .zshrc), управляется ли он через SSH. Я пробовал переменную HOST, но это всегда имя компьютера, на котором работает оболочка. Могу ли я получить доступ к имени хоста, откуда идет сеанс SSH? Сравнение этих двух вопросов решило бы мою проблему.
Каждый раз, когда я вхожу, появляется сообщение с указанием времени последнего входа и хоста:
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
Это означает, что сервер имеет эту информацию.
ssh
shell-script
zsh
stribika
источник
источник
.profile
. И какое это имеет отношение к переадресации агентов?SSH_AUTH_SOCK
переменную. Но зачем вам запускать агент SSH в этом случае? Вы имели в виду запуск агента, если вы вошли в систему без переадресации агента? Почему бы не запустить агент, если его еще нет ([ -n "$SSH_AUTH_SOCK" ] || eval $(ssh-agent)
)?SSH_*
Переменные также устанавливаются в подпроцессах оболочки, которая находится в начале сеанса SSH, например, если вы запускаете сеанс экрана через SSH (вы должны сбросить переменные перед началом сеанса, если вам это нужно). Я думаю, что причиной тестирования родительского процесса является то, что я начал это делать до того, как sshd определил какие-либо переменные среды.Вы должны быть в состоянии проверить с помощью
SSH_TTY
,SSH_CONNECTION
илиSSH_CLIENT
переменных.источник
env_keep
в ,sudoers
чтобы заставить его работать поsu
командам :)У меня просто была такая же проблема в Linux с использованием Bash. Сначала я использовал переменную окружения SSH_CONNECTION, но потом понял, что она не установлена, если вы
su -
.Решение lastlog выше не сработало ни после,
su
ниsu -
.Наконец, я использую
who am i
, который показывает удаленный IP (или имя хоста) в конце, если это соединение SSH. Это также работает после su.Используя регулярные выражения Bash, это работает:
Если zsh не поддерживает регулярные выражения, то же самое может быть достигнуто разными способами с помощью grep, cut, sed или чего-либо еще.
Для любопытных, вот что я использую в root'е .bashrc:
Альтернативой, которая также работает,
su
будет рекурсивный поискsshd
по родительским процессам:Если функция добавлена в .bashrc, ее можно использовать как
if is_ssh; then ...
источник
tmux
сеансах, а также имеет проблемы при входе в систему через IPv6 и обратного имени DNS не существует.who am i
не показывает ваш адрес IPv6?who am i
ничего не возвращает в удаленномtmux
сеансе. 2) IPv6-адрес может содержать двоеточия, которые не разрешены вашим регулярным выражением. Это может быть сложно, так какwho am i
содержится(:0.0)
в X сессий для меня (xterm).screen
.Я думаю, что ответы Жиля и Cakemox хороши, но только для полноты ...
исходит от
pam_lastlog
1 .Вы можете распечатать
pam_lastlog
информацию с помощью командыlastlog
2 , напримердля локального входа, по сравнению с
для входа по SSH.
В моей системе это работает, чтобы извлечь его
last
иw
может быть полезным, например,1 Linux / FreeBSD документация для
pam_lastlog
.2 справочные страницы по Linux / FreeBSD
lastlog(8)
.источник
Начните с изучения вашей среды и поиска правильного варианта
Вы можете подключиться ко многим из этих переменных среды, чтобы инициировать конкретные действия в зависимости от их присутствия.
источник
Это для проверки всех установленных соединений от другого пользователя с использованием SSH
источник