我想要为 SSH 用户显示横幅(欢迎信息),并且为每个用户提供特定的欢迎信息。
答案1
您没有指定使用哪个 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
也可以看看针对特定用户或 IP 禁用 ssh 横幅。
当然,您也可以使用自定义实现的消息/横幅。只需使用全局配置文件脚本中的自定义逻辑打印所选消息即可。
与 MOTD 一样,这不适用于非交互式会话(SFTP 等)。
更重要的是,它不仅不起作用,你需要确保仅在交互式终端上打印消息。OpenSSH 自动为 执行的操作/etc/motd
。要么使用仅为交互式终端执行的全局配置文件脚本,要么根据TERM
环境变量的值有条件地打印消息。
如果您为非交互式会话打印消息,则会破坏任何使用严格协议(例如 SFTP 或 SCP)的客户端,因为客户端会尝试将您的文本消息解释为协议消息,从而导致严重失败。
例如WinSCP SFTP/SCP 客户端文档中对此类问题的描述。
(我是 WinSCP 的作者)
答案2
您也可以使用"$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。