我想为每个用户显示特定欢迎消息的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使用Banner和Match指令在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。