Linux登陸提示(靜態/動態MOTD)vim
在用戶輸入口令或使用密鑰成功登陸後,讓服務器自動爲咱們執行幾個簡單的操做,如打印提示信息,打印異常信息,執行一個腳本,或者發送郵件等。可以預先提示信息給登陸者,讓咱們在登陸機器採起任何操做以前,能夠快速的瞭解這臺機器的重要信息。看起來是否是頗有意思呢? 也許咱們會想,這對於服務器的安全加固並無直接的影響,並且每次剛剛登陸就執行一系列命令、腳本(如收集服務器資源使用狀況的信息),彷佛也有點多餘。所以,若是是在生產環境的Linux服務器而且須要配置登陸提示,諸如登陸執行命令、腳本等這些操做,咱們沒必要爲此寫一個複雜的、龐大的腳本,腳本的執行時間很關鍵,若是你不想在正確輸入登陸密碼後仍需等待幾秒或更長的時間,那麼,儘量地把腳本的執行耗時優化到幾毫秒,甚至更低。(登陸後的提示或操做盡量簡單的、有利的是最好的。若是你想這麼作)安全
在大多數Linux分發版中,能夠直接修改/etc/motd文件來定製任何想要的提示信息,修改方法是將須要打印的提示消息文件粘貼到該文件中便可(一些可執行命令或腳本在文件中僅僅被看成是普通字符/文本)。/etc/motd內的文本消息是固定不變,除非咱們手動修改它。所以,在/etc/motd中定製的消息是靜態MOTD。bash
若是你使用過Debian/Ubuntu分發版,你可能已經發現,Ubuntu默認就已經有一個動態的MOTD信息提示(經過SSH或本地登陸時顯示系統當前的一些信息)。在RHEL/CentOS中不可能實現像在Debian/Ubuntu中這樣的功能,由於RHEL/CentOS並無提供與之相關的任何腳本。咱們能夠經過環境變量文件,如/etc/profile、/etc/bashrc等,將須要執行的命令或腳本添加到這些文件末尾,這樣當每次用戶登錄時,系統就會讀取這些文件,執行文件裏定義好的腳本。除此以外,也能夠結合使用crontab計劃任務,將預先準備好的腳本,如系統監控,異常信息收集經過crontab在後臺按期執行,並把收集到的信息重定向寫到/etc/motd文件中。在用戶登陸系統時,就能夠顯示這些系統監控、異常處理信息了。服務器
在Ubuntu中,提供了一組腳本在目錄/etc/update-motd.d/中,在用戶登陸時,按照腳本名字前綴的數字(00-99)順序執行,並將這些腳本的輸出保存到文件/run/motd.dynamic中,最終用戶成功登陸後,在登陸的屏幕界面中打印出來。輸出結果以下圖所示ssh
/etc/update-motd.d/腳本列表:ide
00-header 優化
10-help-text ui
50-landscape-sysinfo spa
90-updates-available 3d
91-release-upgrade
98-fsck-at-reboot
98-reboot-required
以上是在Ubuntu 14.04 LTS中默認的提供動態MOTD消息的腳本,這些腳本能夠修改,也能夠增長本身的腳本。好比替換爲本身的定製好的腳本。
下面我給出在RHEL/CentOS中定製MOTD的幾個簡單操做示例:
打印提示信息,執行一個腳本,或者發送郵件
l 任何用戶遠程或本地登陸後打印提示信息(如提示登陸者這是一臺重要的服務器,要求登陸者謹慎操做)
>> 開啓SSH服務打印MOTD消息,配置文件/etc/ssh/sshd_config,確認是否以下配置(默認爲yes)
PrintMotd yes
>> 修改/etc/motd文件,將提示消息粘貼到該文件中
[root@localhost ~]# cat /etc/motd *************************************************** * 注意: 這是一臺重要的生產服務器,請謹慎操做!! * * 如須要重啓/關閉服務器,請先將NFS卸載 * ***************************************************
>> 保存以後,使用SSH登陸該服務器,輸入正確的帳號密碼以後,提示以下
固然,僅僅像這樣簡單的提示遠遠不夠,咱們能夠根據這臺服務器的特徵、運行的服務、文件系統信息以及重要的細節信息等打印出來,讓其餘的IT人員登陸該服務器時,在採起任何操做以前,能夠快速的掌握這臺服務器的重要信息。也能夠起到一個警戒的做用。你能夠根據本身的狀況定製。
l RHEL/CentOS中打印動態MOTD提示
>> 任何用戶經過SSH遠程登陸打印提示以下
>> 建立系統信息收集腳本
[root@HMing ~]# vim /usr/src/scripts/system_info.sh #!/bin/bash date=`date "+%F %T"` head="System information as of: $date" kernel=`uname -r` hostname=`echo $HOSTNAME` #Cpu load load1=`cat /proc/loadavg | awk '{print $1}'` load5=`cat /proc/loadavg | awk '{print $2}'` load15=`cat /proc/loadavg | awk '{print $3}'` #System uptime uptime=`cat /proc/uptime | cut -f1 -d.` upDays=$((uptime/60/60/24)) upHours=$((uptime/60/60%24)) upMins=$((uptime/60%60)) upSecs=$((uptime%60)) up_lastime=`date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"` #Memory Usage mem_usage=`free -m | awk '/Mem:/{total=$2} /buffers\/cache/ {used=$3} END {printf("%3.2f%%",used/total*100)}'` swap_usage=`free -m | awk '/Swap/{printf "%.2f%",$3/$2*100}'` #Processes processes=`ps aux | wc -l` #User users=`users | wc -w` USER=`whoami` #System fs usage Filesystem=$(df -h | awk '/^\/dev/{print $6}') #Interfaces INTERFACES=$(ip -4 ad | grep 'state ' | awk -F":" '!/^[0-9]*: ?lo/ {print $2}') echo echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" echo "$head" echo "----------------------------------------------" printf "Kernel Version:\t%s\n" $kernel printf "HostName:\t%s\n" $hostname printf "System Load:\t%s %s %s\n" $load1, $load5, $load15 printf "System Uptime:\t%s "days" %s "hours" %s "min" %s "sec"\n" $upDays $upHours $upMins $upSecs printf "Memory Usage:\t%s\t\t\tSwap Usage:\t%s\n" $mem_usage $swap_usage printf "Login Users:\t%s\t\t\tWhoami:\t\t%s\n" $users $USER printf "Processes:\t%s\n" $processes printf "\n" printf "Filesystem\tUsage\n" for f in $Filesystem do Usage=$(df -h | awk '{if($NF=="'''$f'''") print $5}') echo -e "$f\t\t$Usage" done printf "\n" printf "Interface\tMAC Address\t\tIP Address\n" for i in $INTERFACES do MAC=$(ip ad show dev $i | grep "link/ether" | awk '{print $2}') IP=$(ip ad show dev $i | awk '/inet / {print $2}') printf $i"\t\t"$MAC"\t$IP\n" done echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" echo
>> 給腳本增長執行權限
[root@HMing ~]# chmod +x /usr/src/scripts/system_info.sh
>> 將腳本的路徑名添加到/etc/profile文件末尾
[root@HMing ~]# tail -1 /etc/profile /usr/src/scripts/system_info.sh
l 任何用戶遠程或本地登陸後發送郵件信息
>> 演示以下
>> 發送郵件以下
>> 建立一個發送郵件的腳本/usr/src/scripts/my-server-login-mail,以下
#!/bin/bash smtp=smtp.163.com smtp_auth_user=xxxxxx smtp_auth_password=xxxxxxxxxx from=xxxxxxxx@163.com function HEAD { Kernel_version=`uname -r` Login_user=`last -a | grep "logged in" | wc -l` Up_lastime=`date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S"` Up_runtime=`cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second =$1 % 60;printf("%d天%d時%d分%d秒",run_days,run_hour,run_minute,run_second)}'` Last_user=`last | awk '(/pts/) && (/-/){print "User: "$1" - ""OlineTime: "$NF" - ""IP: "$3" - ""LoginTime: "$4" "$5" "$6" " $7}'| head -1 | sed -e 's/(//g' -e 's/)//g'` echo -e "" echo -e "\ 郵件提示: 未知身份來源使用${USER}用戶登陸系統 ------------------------------------------------------------- System information 主機名: $HOSTNAME 內核版本: $Kernel_version 系統已運行時間: $Up_runtime 上一次重啓時間: $Up_lastime 當前登入用戶數: $Login_user 上一次登入用戶: $Last_user ------------------------------------------------------------- " };HEAD >/tmp/.loginmail title="主機:`echo $HOSTNAME`登陸提示 (`date "+%F %T"`)" body=`cat /tmp/.loginmail` to=741616710@qq.com sendEmail -s "$smtp" -xu "${smtp_auth_user}" -xp "${smtp_auth_password}" -f "$from" -t "$to" -u "$title" -m "$body" &>/dev/null && rm -rf /tmp/.loginmail
在Linux發送郵件的程序有不少,在這裏我用的是sendEmail,你也可使用其餘的發送郵件程序。
>> 將腳本絕對路徑名添加到/etc/profile文件末尾
[root@HMing ~]# tail -1 /etc/profile /usr/src/scripts/my-server-login-mail
結語
動態的MOTD在Ubuntu中是開箱即用的,由於它已經被集成爲系統的一個模塊,經過pam_motd.so調用。不過,咱們能夠隨時修改系統上預先配置好的腳本,將腳本放到/etc/update-motd.d/目錄中,好比收集系統異常信息腳本,在用戶登陸時,將在第一時間反饋給用戶,或者是系統登陸記錄的實時監控,經過發生郵件給用戶,用戶能夠快速掌握服務器是否存在被***的狀況。對於RHEL/CentOS發行版,我在文中也給出了幾個簡單的演示示例,實現動態MOTD。有興趣同窗的能夠做爲參考。