Выполнить действие, когда пользователь входит в систему через SSH с определенного хоста

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

предположим, что это результат моей "последней" команды в среде Linux:

root  pts/1        192.168.1.10      Wed Feb 10 07:04 - 07:57  (00:52)  
root  pts/2                          Tue Feb  9 22:00 - 00:13  (02:13)   

Как я могу настроить определенное действие (скажем, например, измененный MOTD или отправку электронной почты), если пользователь "root" вошел в систему с 192.168.1.10. Есть ли способ получить эту информацию?

вторая часть этого вопроса заключается в том, что как я могу сделайте вышеуказанную проверку немного более надежной-т. е. если у меня есть следующее:

mary  pts/1        192.168.1.10      Wed Feb 10 07:04 - 07:57  (00:52)  
bob   pts/2                          Tue Feb  9 22:00 - 00:13  (02:13)      

теперь я хотел бы выполнить действие, если имя пользователя равно "mary", а хост-192.168.1.10.

любые предложения приветствуются.

спасибо заранее.

6 ответов


есть специальный файл /etc/ssh/sshrc где вы можете поместить некоторые команды, которые будут выполняться каждый раз, когда кто-то подключается по ssh. Я написал это для вас:

#!/bin/bash

mail=user@domain.tld
monitored_user=root
monitored_ip=x.x.x.x

hostname=$(hostname)

# add a welcome message:
printf >&2 "\nWelcome on $hostname $USER\n"

read -d " " ip <<< $SSH_CONNECTION

[[ $ip == $monitored_ip && $USER == $monitored_user ]] || exit 0

date=$(date "+%d.%m.%Y %Hh%M")
reverse=$(dig -x $ip +short)

mail -s "Connexion of $USER on $hostname" $mail <<EOF

IP: $ip
Reverse: $reverse
Date: $date
EOF

поместите этот скрипт в файл, затем поместите полный путь скрипта в /etc/ssh/sshrc

на man ssh :

в/etc/СШ/кпчюс : Команды в этом файле выполняются ssh, когда пользователь войдите в систему непосредственно перед запуском оболочки (или команды) пользователя. Увидеть страница руководства sshd(8) за дополнительной информацией.


Спасибо за все ваши ответы. В конце концов мне удалось найти решение, которое пока работает, но у него есть один недостаток, на который я укажу через минуту.

я добавил следующее в файл /etc/bashrc (или /etc/bash.bashrc в любой среде, которую вы используете):

HOST="192.168.0.1"
RHOST=`who am i | sed -n 's/.*(\([^) ]*\).*//p; 1q'`
if [ "$RHOST" == "$HOST" ]; then
        echo "SAY WHAT!"
        #add further actions here if needed
fi

недостаток, о котором я говорил раньше, может на самом деле не быть недостатком. Если вы уже SSH-ed в системе, и вы хотите SSH хосту, который живет на том же IP, скажем ssh root@your-host who am i затем напечатает "your-host", но я думаю, что так и должно быть.

Излишне говорить, что выше sed оператор может быть изменен, так что вы можете захватить имя пользователя, а также, и вы можете расширить if/else заявление для удовлетворения ваших потребностей.

еще раз спасибо за все ваши ответы.


один из способов-периодически запускать простой скрипт:

#!/bin/bash
users=$(last | sed -ne '/192\.168\.1\.10/ s/\([^ ]*\).*//p')
for user in $users; do
    sendmail "$user" < email.txt
done

это передаст последнюю команду в sed, чтобы извлечь список пользователей и сохранить его в переменную $users. Команда sed использует -n флаг, поэтому он печатает только то, что мы ему говорим. Во-первых, мы выбираем строки, содержащие указанный IP, с /192\.168\.1\.10/ "адрес". В этих строках мы пытаемся извлечь символы перед пробелом, и если нам это удастся, мы напечатаем результат.

тогда мы можем сделать петлю через $users переменная и действуйте соответственно.

один из способов вызвать это повторно будет через cron, и более простым способом было бы сделать while true; do ./my_script.bash; sleep 60; done.


Вы можете добавить что-то /etc/profile или эквивалент, что делает что-то в зависимости от значения $SSH_CLIENT.


похоже, вы используете last потому что он читает /var/log/wtmp по умолчанию это запись Логинов. The who команда также позволяет читать тот же файл, но с интерфейсом больше для ваших нужд.

например:

$ who --ips /var/log/wtmp | grep '^msw.*127.0.0.1'
msw      pts/2        2012-10-07 15:52 127.0.0.1
msw      pts/3        2012-10-07 15:55 127.0.0.1

где ни одна из этих сессий не была активной, а скорее исторической и зарегистрированной.


в ubuntu я поставил скрипт в

/etc/profile.d

и когда кто-то (пользователь ssh) входит в систему, он отправляет электронное письмо на мою почту

#/etc/profile.d/run_on_loggin.sh
echo $(who i am) | mail -s 'SSH Login Notification' mymail@hotmail.com

Я хочу создать php-файл с smtp, чтобы отправить мне письмо с моей почтой... несколько раз hotmail сохранялся в спаме...

Если у меня есть php-файл, я буду работать как этой...

Если я хочу передать var в файл php, запустите как этой...

извините мой английский: 3

Примечание: i подумайте, что эта команда запускается от пользователя, будьте осторожны, если у пользователя нет разрешения использовать какую-либо команду или отправлять электронную почту.