每个用户的 SSH MOTD

每个用户的 SSH MOTD

我想要为 SSH 用户显示横幅(欢迎信息),并且为每个用户提供特定的欢迎信息。

答案1

您没有指定使用哪个 SSH 服务器。我假设是 OpenSSH。

请注意,SSH 横幅和 MOTD 是两个不同的东西。

虽然在 SSH 终端中几乎难以区分,但它们的行为却不同,例如在 SFTP 客户端中。


MOTD 只是打印在交互式终端上的文本。因此,它不会(也不能)被发送到 SFTP 客户端(稍后会详细介绍)。

MOTD 已硬编码到/etc/motdOpenSSH 中。您可以使用指令全局打开/关闭它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使用BannerMatch指令

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。

相关内容