2012-10-08 287 views
9

我有一個困惑我quesiton,我不知道是否有人試圖實現以下目標:執行操作

讓我們假設這是我的「最後」的結果命令在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或發送電子郵件)如果「根」用戶從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)  

現在我想執行,如果用戶名行動等於'瑪麗',主機是192.168.1.10。

歡迎任何建議。

預先感謝您。

回答

1

感謝您的答覆。最終我設法找到了一個暫時可行的解決方案,但它確實有一個缺陷,我會在一分鐘內指出。

我加入以下到我的/ etc/.bashrc的文件(或者/etc/bash.bashrc你使用任何環境):

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

,我是之前談論實際上可能不是缺陷是一個缺陷。如果你已經通過SSH連接到系統中,並且你想SSH連接到一個生活在同一個IP上的主機,比如說ssh [email protected]who am i會打印'your-host',但我認爲這是它應該的樣子。

不用說,上面的sed語句可以修改,以便您可以捕獲用戶名,並且您可以擴展if/else語句以滿足您的需求。

再次感謝您的回覆。

+0

你測試了我的'sshrc'文件嗎? =) –

+0

我喜歡你的解決方案以及sputnick,謝謝! :) – Tamas

+0

嗨sputnick。我們到達了2級:)你知道如何排除記錄來自cronjobs /代碼片段的ssh命令。我只對用戶從控制檯登錄感興趣。謝謝。 – Tamas

0

一種方法是定期運行一個簡單的腳本:

#!/bin/bash 
users=$(last | sed -ne '/192\.168\.1\.10/ s/\([^ ]*\).*/\1/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

+0

Re cron vs while,而不是使用inotifywait檢測/ var/log/wtmp中的更改。 –

+0

謝謝Janito。我認爲必須有更多的「互動」。我的想法是,如果最後一次使用某個ssh-s值更新lastlog,那麼可以捕獲相同的信息,然後將其放入/etc/bash.bashrc文件中,以便在登錄時調用它。 – Tamas

0

您可以在/etc/profile或其他等效物上添加一些東西,這取決於$SSH_CLIENT的值。

0

看起來您正在使用last,因爲它默認讀取/var/log/wtmp這是登錄記錄。 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 

那裏既沒有這些會議的活躍,而是歷史和記錄。

15

有一個特殊的文件/etc/ssh/sshrc你可以放一些命令,每次有人連接時運行ssh。我寫的你:

#!/bin/bash 

[email protected] 
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/sshrc : Commands in this file are executed by ssh when the user logs in, just before the user's shell (or command) is started. See the sshd(8) manual page for more information.

+0

把這個腳本放在一個文件中,然後把腳本的完整路徑放在'/ etc/ssh/sshrc'中,因爲sshrc文件不處理bash測試。 POST相應編輯。 –

+1

我有一個「語法錯誤:意外重定向」。第12行。 – Sergey

+0

我遇到了與@Sergey相同的問題。另外,它似乎不喜歡'[['。我在腳本中試着'echo $ SHELL'來確認它是bash。 FWIW'['工作。哦,並且'dig'沒有安裝。 – Sparhawk

0

在Ubuntu我把腳本

/etc/profile.d 

當有人(用戶SSH)登錄,它發送郵件到我的郵箱

#/etc/profile.d/run_on_loggin.sh 
echo $(who i am) | mail -s 'SSH Login Notification' [email protected] 

我想創建一個PHP文件smtp,發送電子郵件與我的郵件給我... hotmail保存在垃圾郵件的一些時間...

如果我有php文件我將運行像this ...

,如果我想通過VAR到文件運行PHP喜歡this ...

原諒我的英文:3

注:我覺得從用戶使用此命令運行,仔細如果用戶doen't有權使用某些命令或發送電子郵件。