尝试在每日消息 (MOTD) 中打印用户名

尝试在每日消息 (MOTD) 中打印用户名

我正在测试一个简单的脚本,该脚本向登录服务器的用户打印欢迎消息。

剧本:

#!/bin/sh
_user=$(whoami)
_hostname=$(hostname)
_currdate=$(date)

echo "#===================================================#"
echo "          Welcome $_user to $_hostname server"
echo "          Curr. time: $_currdate"
echo "          Have a nice day!"
echo " "
echo  "#==================================================#"

我正在将脚本保存在/etc/update-motd.d/,以便用户登录后出现该消息。问题是var_user总是显示为““我找不到从用户那里获取用户名的方法。我正在通过 SSH 进行测试。

有人能帮帮我吗?谢谢!:)

答案1

Grawity 的回答是错误的。他声称 motd 是一个全局文件,但原帖作者明确表示他在 /etc/update-motd.d/ 中工作。

/etc/update-motd.d/ 允许动态生成 MOTD 并可以运行实际脚本或应用程序。

话虽如此,我遇到了和你一样的问题。问题是,在执行 MOTD 期间,权限尚未降到用户帐户,因此所有脚本都以 root 身份运行。

我设法找到了一种适用于 Debian 机器的解决方案。我没有在其他发行版上尝试过。我的解决方案是从“ps”输出中检索用户名,因为 sshd 显示用户名,例如:

root      4179  0.0  0.0  93984  5952 ?        Ss   10:44   0:00 sshd: johndoe [priv] 

我的小脚本在进程树中“向后搜索”以找到包含用户名的进程。

PPID1=`cat /proc/$PPID/status | grep PPid | awk '{ print $2 }'`
PPID2=`cat /proc/$PPID1/status | grep PPid | awk '{ print $2 }'`
USERNAME=`ps -x | grep $PPID2 | awk '{ print $6 }' |  sed "s/[[:digit:].-]//g"`

用户名现在在 $USERNAME 变量中。

答案2

你不能。mod 是全球的文件,在用户之间共享(即 /etc/motd),并且仅在重启时更新(我猜偶尔更新)。因此不可能存在任何特定于用户或特定于会话的内容。

/etc/profile相反,添加要由 shell 显示的消息:

if [ -t 1 ] && [ ! -f ~/.hushlogin ]; then
    echo "Welcome to $(hostname), $(whoami)!"
    echo "$(ddate). Have a nice day."
fi

答案3

以下方法不适用于本地登录,但是我的 motd 不会在本地登录时弹出,并且 OP 正在寻找与 SSH 相关的解决方案;所以这里有一个神奇的咒语,用于捕获通过 SSH 登录的最新用户的用户名到 motd 脚本中的变量。

_user="$(grep 'sshd' /var/log/auth.log | awk '/Accepted publickey for/{print $9}' | tail -1)"

更正,grep似乎不需要......

_user="$(awk '/Accepted publickey for/ {print $9}' /var/log/auth.log | tail -1)"

虽然我不确定当两个或更多用户同时登录时会报告什么;所以不要依赖它来维护安全或隐私。

相关内容