2

Я тестирую простой скрипт, который печатает приветственное сообщение для пользователей, которые входят в систему на сервере.

Сценарий:

#!/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 ответа3

4

Ты не можешь Motd - это глобальный файл, общий для пользователей (это /etc /motd), который обновляется только при перезагрузке (и, я думаю, время от времени). Так что не может быть ничего конкретного пользователя или сессии.

Вместо этого добавьте ваши сообщения в /etc/profile чтобы они отображались оболочкой:

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

Гравити ответ неверный. Он заявляет, что 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.

0

Следующее не будет работать для локальных входов в систему, но, опять же, мой motd не выдает для меня локальные входы в систему, и OP ищет решение, связанное с SSH; так что вот волшебное заклинание для захвата имени пользователя последнего пользователя, который вошел через SSH в переменную в скрипте motd.

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

Хотя я не уверен, что будет сообщено, если / когда два или более пользователей войдут в систему одновременно; так что не надейтесь на это для обеспечения безопасности или сохранения конфиденциальности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .