每个用户的SSH MOTD

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

你没有指定,你使用的是什么SSH服务器。 我假设OpenSSH。

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

虽然在SSHterminal中几乎不可区分,但它们具有不同的行为,例如,在SFTP客户端中。


MOTD只是一个印在互动terminal上的文字。 因此,它不会(也不能)被发送到SFTP客户端,例如(稍后更多)。

MOTD是硬编码到OpenSSH中的/etc/motd 。 您只能使用PrintMotd指令全局打开/closures它。

但是,在某些Linux系统上, PrintMotd始终closures,而MOTD则由PAM堆栈(使用pam_motd模块)打印。 在这种情况下,您可以通过/etc/pam.d/sshdclosures它,或者指定一个自定义的motd=path作为模块参数。


SSH标志是一个特殊的SSH 2.0function,通过特定的SSH数据包(SSH2_MSG_USERAUTH_BANNER)发送。

因此,即使是非terminal客户端,如SFTP客户端,也可以对其进行处理并显示给用户。 看看如何在WinSCP的SFTP / SCP客户端中显示标题 。

SSH Banner使用BannerMatch指令在sshd_config为每个用户(或组或其他标准)configuration:

 Match User username1 Banner /etc/banner_user1 Match User username2 Banner /etc/banner_user2 

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


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

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

更重要的是,不仅不能工作, 还需要确保只打印交互式terminal的信息。 OpenSSH为/etc/motd自动执行什么操作。 可以使用仅为交互式terminal执行的全局configuration文件脚本,也可以根据TERM环境variables的值有条件地打印该消息。

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

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

(我是WinSCP的作者)

您也可以使用"$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。