每个用户的 SSH MOTD

use*_*277 17 linux ssh banner motd

我想为 SSH 用户显示横幅(欢迎消息),并为每个用户显示一条特定的欢迎消息。

Mar*_*ryl 40

您没有指定,您使用的是什么 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_configusingBannerMatch指令中按用户(或组或其他条件)进行配置:

Match User username1
    Banner /etc/banner_user1

Match User username2
    Banner /etc/banner_user2
Run Code Online (Sandbox Code Playgroud)

另请参阅禁用特定用户或 ips 的 ssh 横幅


当然,您也可以对消息/横幅使用自定义实现。只需打印使用您的自定义逻辑从全局配置文件脚本中选择的消息。

与 MOTD 一样,这不适用于非交互式会话(SFTP 等)。

更重要的是,它不仅不起作用,您还需要确保仅为交互式终端打印消息。OpenSSH 自动为/etc/motd. 要么使用仅针对交互式终端执行的全局配置文件脚本,要么根据TERM环境变量的值有条件地打印消息。

如果您为非交互式会话打印消息,则会破坏任何使用严格协议(例如 SFTP 或 SCP)的客户端,因为客户端会尝试将您的文本消息解释为协议消息,但会严重失败。

请参阅WinSCP SFTP/SCP 客户端文档中此类问题的示例描述

(我是 WinSCP 的作者)


c4f*_*t0r 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
Run Code Online (Sandbox Code Playgroud)

因此,您可以为每个用户拥有一个 ssh rc。