В настоящее время я настраиваю довольно сложную конфигурацию bash, которая будет использоваться на нескольких машинах. Я пытаюсь выяснить, возможно ли определить, вошел ли я через SSH или на локальный компьютер. Таким образом, я мог бы, например, установить псевдонимы в зависимости от этого факта. Как альясинг halt
к restart
так остановить удаленный сервер не может быть лучше всего сделать.
До сих пор я знаю, что переменная окружения SSH_CLIENT
устанавливается, когда я захожу через ssh. К сожалению, эта переменная отбрасывается, когда я запускаю оболочку суперпользователя sudo -s
. Я также знаю, что могу передать в sudo параметр, который инструктирует sudo скопировать все мои переменные среды в новую среду оболочки, но если я не хочу этого делать, есть ли другой способ?
ps afx
и TTY для неработающей оболочкиps
будет другим логином.who am i
.who am i
, так что вы можете оттуда определить, являетесь ли вы SSHing или нет. Это работает:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
who
любые два дополнительных аргумента.who am i
такой же какwho is me
илиwho is awesome
или илиwho potato potato
. Факт, который я нашел немного интересным.Вот отличный ответ, который я нашел на unix.stackexchange :
SSH_CLIENT
илиSSH_TTY
определена, это ssh-сессия.ps -o comm= -p $PPID
. Если это такsshd
, это сессия ssh.источник
Вы можете добавить
SSH_*
кenv_keep
в ,sudoers
так что это может быть обнаружено во время переключился на другой пользователь.источник
Если вы хотите узнать, является ли ваша оболочка bash напрямую дочерним процессом sshd (не n> 1 уровня), вы можете
он должен дать вам
sshd
или как называется имя родительского процесса вашей текущей оболочки.источник
ps -o cmd= $PPID
илиawk '/^Name:/ {print $2}' /proc/$PPID/status
Я думаю, что вы хотите переосмыслить то, как вы думаете о проблеме. Вопрос не в том, «вошел ли я через SSH, потому что хочу отключить определенные команды». Это «Я вошел в систему с консоли, потому что тогда я включу определенные команды».
источник
Да, как отмечали другие, информация указана в скобках при выводе вашего IP
who am i
.Вы можете использовать регулярные выражения Bash, чтобы обнаружить это:
источник
Я придумал следующее, основываясь на советах других здесь.
Он использует переменную для кэширования - я использую ее в своей теме оболочки.
Источник:
is_ssh
в https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63 .источник
Найдите родительский cmdline вашей оболочки и введите его. Может быть что-то вроде следующего:
Отредактировано, чтобы заставить это фактически работать :)
источник
Все остальные ответы работают, если вы находитесь на первом уровне входа в систему. Но если после входа в систему вы запускаете 'su' или 'sudo' (в моем случае, чтобы переключиться на учетную запись пользователя без оболочки по соображениям безопасности, мне нужно было выполнить: sudo su - <userid> -s / bin / bash - л) , их решение не удалось.
Следующее является универсальным решением; используя pstree, вы проверяете sshd как родитель.
Вот вывод egrep, когда --quiet удален. Он показывает всю иерархию, которая соответствует, если один подключен удаленно.
источник
Пожалуйста, имейте в виду, что этот ответ очень специфичен для Linux.
Это делает ключевое предположение: у процесса входа в систему не будет контрольного TTY; Вы , вероятно , хотите , чтобы проверить , если у вас есть контрольный TTY перед запуском этого кода (который, основываясь на ваши требования, вероятно , является безопасным выбором, так или иначе).
Код выполняет итерацию вверх по дереву процессов, пока не найдет процесс, который не имеет управляющего TTY.
$initiator_name
будет именем этого процесса (например, "sshd").источник