尝试在当天消息(MOTD)中打印用户名

tzl*_*ima 4 linux ssh bash ubuntu

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

剧本:

#!/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  "#==================================================#"
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮助我吗?谢谢!:)

Rud*_*sma 7

Grawity 的答案是不正确的。他说 motd 是一个全局文件,但 OP 明确指出他在 /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] 
Run Code Online (Sandbox Code Playgroud)

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

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"`
Run Code Online (Sandbox Code Playgroud)

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


use*_*686 5

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

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

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