web-dev-qa-db-ja.com

今日のメッセージ(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は常に "root"と表示され、ユーザーからユーザー名を取得する方法が見つかりません。私はこれをSSH経由でテストしています。

誰かが私を助けることができますか?ありがとう! :)

3
tzlima

できません。 motdはglobalファイルであり、ユーザー間で共有され(/ etc/motd)、再起動時にのみ更新されます(たまにあると思います)。したがって、ユーザー固有またはセッション固有のものはあり得ません。

代わりに、メッセージを/etc/profileに追加して、シェルに表示します。

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

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変数に含まれます。

4
Rudy Broersma

以下はローカルログインでは機能しませんが、やはり私のmotdはローカルログインでポップせず、OPはSSH関連のソリューションを探しています。これが、SSH経由でmotdスクリプト内の変数にログインした最新のユーザーのユーザー名をキャプチャするための魔法の呪文です。

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

2人以上のユーザーが同時にログインした場合に何が報告されるかはわかりませんが、したがって、セキュリティやプライバシーの維持のためにこれに依存しないでください。

1
S0AndS0