Answers:
您未指定使用的是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客户端中的显示方式。
可以sshd_config
使用Banner
和Match
指令为每个用户(或组或其他条件)配置SSH标语:
Match User username1
Banner /etc/banner_user1
Match User username2
Banner /etc/banner_user2
另请参阅为特定用户或ips禁用ssh标语。
当然,您也可以为消息/横幅使用自定义实现。只需打印使用自定义逻辑从全局配置文件脚本中选择的消息即可。
与MOTD一样,这不适用于非交互式会话(SFTP等)。
更重要的是,不仅它不起作用,还需要确保仅为交互式终端打印消息。OpenSSH自动为做什么/etc/motd
。使用仅对交互式终端执行的全局概要文件脚本,或者根据TERM
环境变量的值有条件地打印消息。
如果您为非交互式会话打印消息,则会破坏任何使用严格协议的客户端,例如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。
groups|awk '{print $1}'
cat /etc/motd.${PGROUP}在添加此行之前,我为/ etc目录下的每个用户创建标题文件。并像motd.root和motd.alex这样的文件对我有用。