サーバーにログインしているユーザーにウェルカムメッセージを出力する簡単なスクリプトをテストしています。
スクリプト:
#!/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
は常に "root"と表示され、ユーザーからユーザー名を取得する方法が見つかりません。私はこれをSSH経由でテストしています。
誰かが私を助けることができますか?ありがとう! :)
できません。 motdはglobalファイルであり、ユーザー間で共有され(/ etc/motd)、再起動時にのみ更新されます(たまにあると思います)。したがって、ユーザー固有またはセッション固有のものはあり得ません。
代わりに、メッセージを/etc/profile
に追加して、シェルに表示します。
if [ -t 1 ] && [ ! -f ~/.hushlogin ]; then
echo "Welcome to $(hostname), $(whoami)!"
echo "$(ddate). Have a Nice day."
fi
Grawityの答えは正しくありません。彼は、motdはグローバルファイルであると述べていますが、OPは、彼が/etc/update-motd.d/で作業していることを明確に述べています。
/etc/update-motd.d/は、動的に生成されたMOTDを許可し、実際のスクリプトまたはアプリケーションを実行できます。
その蜂は言った、私はあなたと同じ問題に直面していた。問題は、MOTDの実行中に、特権がまだユーザーアカウントにドロップされていないため、すべてのスクリプトがrootとして実行されることです。
Debianマシンで動作するソリューションを見つけることができました。他のディストリビューションでは試していません。 sshdが次のようなユーザー名を表示するので、私のソリューションは「ps」出力からユーザー名を取得します。
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変数に含まれます。
以下はローカルログインでは機能しませんが、やはり私のmotdはローカルログインでポップせず、OPはSSH関連のソリューションを探しています。これが、SSH経由でmotdスクリプト内の変数にログインした最新のユーザーのユーザー名をキャプチャするための魔法の呪文です。
_user="$(grep 'sshd' /var/log/auth.log | awk '/Accepted publickey for/{print $9}' | tail -1)"
2人以上のユーザーが同時にログインした場合に何が報告されるかはわかりませんが、したがって、セキュリティやプライバシーの維持のためにこれに依存しないでください。