SSH MOTD на пользователя

17

Я хочу отобразить баннер (приветственное сообщение) для пользователей SSH с определенным приветственным сообщением для каждого пользователя.

user260277
источник

Ответы:

38

Вы не указали, каким SSH-сервером вы пользуетесь. Я предполагаю, что OpenSSH.

Обратите внимание, что баннер SSH и MOTD - это две разные вещи.

Хотя они почти неразличимы в терминале SSH, они ведут себя по-разному, например, в клиенте SFTP.


MOTD - это просто текст, напечатанный на интерактивном терминале. Таким образом, он не будет (и не может быть) отправлен, например, клиентам SFTP (подробнее об этом позже).

MOTD жестко запрограммирован /etc/motdв OpenSSH. Вы можете включить / выключить его только глобально, используя PrintMotdдирективу.

Однако в некоторых системах Linux PrintMotdвсегда выключен, и вместо этого MOTD печатается в стеке PAM (с использованием pam_motdмодуля). В этом случае вы можете отключить его с помощью /etc/pam.d/sshdили указать пользовательский motd=путь в качестве параметра модуля.


Баннер SSH - это специальная функция SSH 2.0, отправляемая в определенном пакете SSH (SSH2_MSG_USERAUTH_BANNER).

Таким образом, даже нетерминальные клиенты, такие как SFTP-клиенты, могут обрабатывать его и отображать для пользователя. Посмотрите, как баннер отображается в WinSCP SFTP / SCP клиенте, например.

SSH баннер настраивается для каждого пользователя (или группы или по другим критериям) в с sshd_configиспользованием Bannerи в Matchдирективах :

Match User username1
    Banner /etc/banner_user1

Match User username2
    Banner /etc/banner_user2

См. Также Отключить баннер ssh для определенных пользователей или ips .


Конечно, вы также можете использовать пользовательскую реализацию для сообщения / баннера. Просто распечатайте сообщение, выбранное с помощью вашей собственной логики из сценария глобального профиля.

Как и в случае с MOTD, это не будет работать для неинтерактивных сеансов (SFTP и т. Д.).

Что еще более важно, не только это не будет работать, вы должны убедиться, что вы печатаете сообщение только для интерактивного терминала. Что OpenSSH делает автоматически для /etc/motd. Либо используйте сценарий глобального профиля, который выполняется только для интерактивного терминала, либо напечатайте сообщение условно на основании значения TERMпеременной среды.

Если вы распечатываете сообщение для неинтерактивного сеанса, вы нарушаете работу любого клиента, использующего строгий протокол, такого как SFTP или SCP, поскольку клиент попытается интерпретировать ваше текстовое сообщение как сообщение протокола, что приведет к сбою.

См., Например, описание такой проблемы в документации клиента WinSCP SFTP / SCP .

(Я автор WinSCP)

Мартин Прикрыл
источник
Привет всем спасибо за ответ, я получил решение, пожалуйста, поправьте меня, если я не прав. Я добавляю эти строки в файл / etc / profile. PGROUP = groups|awk '{print $1}'cat /etc/motd.$ndomPGROUP} перед добавлением этой строки я создаю файл баннера для каждого пользователя в каталоге / etc. и файл как motd.root и motd.alex, и это работает для меня.
user260277 18.12.14
Это должно сделать тоже. За исключением моего ответа, это работает только в интерактивном терминале. Это не будет работать для SFTP и подобных.
Мартин Прикрыл
значит интерактивный терминал?
user260277 18.12.14
Это терминал, с которым взаимодействует человек (в отличие от сеанса SFTP, сеанса SCP или неинтерактивного терминала, используемого для удаленного выполнения некоторой пакетной задачи)
Мартин Прикрыл
Я включил некоторые хитрые подробности о пользовательской реализации баннера.
Мартин Прикрыл
9

Вы также можете использовать "$HOME/.ssh/rc"файл для архива, что вы хотите сделать

echo "echo Hello World" > /home/pluto/.ssh/rc
ssh pluto@localhost
Last login: Thu Dec 18 08:46:16 2014 from localhost.localdomain
Hello World

Таким образом, вы можете иметь один ssh rc для каждого пользователя.

c4f4t0r
источник
привет, я пытаюсь это, но выдает сообщение об ошибке .ssh / rc: 1: .ssh / rc: welcom: не найдено.
user260277
была моя вина, я сделал опечатку, вам нужно эхо, как в обычном скрипте bash
c4f4t0r
«Wolrd» тоже опечатка :)
simon
Я получаю "stty: стандартный ввод: неуместно ioctl для устройства".
Приостановлено до дальнейшего уведомления.
что у тебя в .ssh / rc?
c4f4t0r