检测域名是否到期
如果你想做一個網站,首先需要購買一個域名,與其說是購買不如說是租用,因為你要想使用這個域名,每年都需要繳納一筆費用。既然是租用,所以就有期限,在到期前沒有續費,則該域名會被收回,其他人可以注冊并使用這個域名。
當我們名下域名非常多的時候,則很容易忘記為這些域名續費從而導致過期并回收。
本案例的需求是,寫一個shell腳本來監控指定的域名是否到期,具體要求如下:
1)寫一個函數,域名以參數的形式傳遞給這個函數
2)域名到期前的一周和到期后的一周(兩周時間),每天都要發告警郵件
3)腳本每天執行一次
?
知識點一:whois
一個域名的信息,比如所有者郵箱、電話、地址和什么時候過期等都是公開的,可以在瀏覽器里訪問https://www.whois.net進行查詢。國內也有不少類似的網站可以查詢域名信息。在Linux命令行下如何查詢呢?
# whois aminglinux.comDomain Name: AMINGLINUX.COMRegistry Domain ID: 1800256822_DOMAIN_COM-VRSNRegistrar WHOIS Server: whois.55hl.comRegistrar URL: http://www.55hl.comUpdated Date: 2018-05-04T22:57:37ZCreation Date: 2013-05-10T06:02:05ZRegistry Expiry Date: 2021-05-10T06:02:05ZRegistrar: Jiangsu Bangning Science & technology Co. Ltd.Registrar IANA ID: 1469Registrar Abuse Contact Email: abuse@55hl.comRegistrar Abuse Contact Phone: +86 025 86883426 1009Domain Status: ok https://icann.org/epp#okName Server: F1G1NS1.DNSPOD.NETName Server: F1G1NS2.DNSPOD.NETDNSSEC: unsignedURL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/ >>> Last update of whois database: 2019-07-25T12:40:54Z <<<系統默認沒有這個命令,需要安裝whois包。
本案例需要監控域名的過期時間,所以要關注的行是Registry Expiry Date。還有一個問題不得不考慮,不同的域(.com,.cn)查詢到的結果有所不同,比如.cn的結果是這樣的:
# whois aminglinux.cn Domain Name: aminglinux.cn ROID: 20160322s10001s82727381-cn Domain Status: ok Registrant ID: mr2272c32qw63z Registrant: 個人用戶名 Registrant Contact Email: 306798658@qq.com Sponsoring Registrar: 北京新網數碼信息技術有限公司 Name Server: ns11.xincache.com Name Server: ns12.xincache.com Registration Time: 2016-03-22 17:42:01 Expiration Time: 2020-03-22 17:42:01 DNSSEC: unsigned所以.cn的過期時間需要關注的行是Expiration Time。
?
知識點二:cut命令
語法:cut -d '分隔字符' [-cf] n 這個n是數字
-d:后面指定分隔字符,分隔字符要用單引號括起來
-c:后面指定第幾個字符
-f:后面指定第幾個區塊
# cat /etc/passwd |cut -d ':' -f 1 |head -n5 root bin daemon adm lp說明:-d后面指定冒號為分隔字符,-f 1表示截取第一段,-f和1之間的空格可有可無。
# head -n2 /etc/passwd |cut -c2 o i # head -n2 /etc/passwd |cut -c1 r b # head -n2 /etc/passwd |cut -c1-10 root:x:0:0 bin:x:1:1: # head -n2 /etc/passwd |cut -c5-10 :x:0:0 x:1:1:說明:-c后面可以是1個數字n,也可以是一個區間n1-n2,還可以是多個數字n1,n2,n3。
# head -n2 /etc/passwd |cut -c1,3,10 ro0 bn:?
知識點三:進程控制
當運行一個進程時,可以按ctrl+z使它暫停,然后使用fg命令恢復它,利用bg命令使它到后臺運行,也可以按ctrl+c終止這個進程。輸入jobs命令,可以看到暫停或者在后臺運行的任務。
如果想把暫停的任務丟在后臺跑起來,就使用bg命令。
# bg [1]+ vi test1.txt & [1]+ Stopped vi test1.txt但是vi并不支持在后臺運行,換一個其他的命令:
# sar 1 > /tmp/1.log ^Z //這里按了ctrl+z [2]+ Stopped sar 1 > /tmp/1.log # jobs [1]- Stopped vi test.txt [2]+ Stopped sar 1 > /tmp/1.log # bg 2 [2]+ sar 1 > /tmp/1.log &說明:多個被暫停的任務會有編號,使用jobs命令可以看到兩個任務,使用bg或者fg的時候,就需要在后面加一個編號。上例中使用bg 2把第二個被暫停的任務丟到后臺跑起來了,命令行下使用命令在最后面加一個&符號,可以將這條命令直接丟入后臺。
丟到后臺的任務如何關閉?
如果沒有退出剛才的shell,那么,先使用“fg 編號”把任務調到前臺,再使用“ctrl+c”結束任務:
# fg 2 sar 1 > /tmp/1.log ^C //這里使用了ctrl+c另一種情況則是,關閉掉了當前的shell,再次打開一個新的shell中時,使用jobs命令并不會顯示在后臺運行或者被暫停的任務,要想停掉它的話,則需要先知道其pid,然后使用kill命令殺死那個進程。
# sar 1 10 > /tmp/1.log & [1] 30218 # ps aux |grep sar root 30218 0.0 0.0 108036 760 pts/0 S 11:22 0:00 sar 1 10 root 30221 0.0 0.0 112724 984 pts/0 S+ 11:22 0:00 grep --color=auto sar在shell腳本中,多條指令執行是有先后順序的,就是說只有前面的指令執行完(不管成功與否),后面的指令才會執行。如果有一條指令運行時間比較久,則會阻礙后面的指令執行。若不想讓這條執行慢的指令影響后面的指令,在執行該指令時,在后面加一個&,把它丟到后臺去。使用&符號把任務丟到后臺運行,會顯示pid信息,如果忘記這個pid,我們還可以使用ps aux命令找到那個進程。想結束掉該進程,需要使用kill命令:
# kill 9433 [1]+ 已終止 sar 1 > /tmp/1.logkill命令語法很簡單,直接在后面加pid即可。
?
知識點四:判斷一個變量是否為空
在shell腳本中,如果一個變量沒有成功賦值就被引用了,則會影響到腳本的正常執行,判斷一個變量的值是否為空有兩種方法:
1)用-z(zero的意思,為空)
# b= //給變量b賦值為空 # if [ -z "$b" ]; then echo "The value of b is null.";else echo "The value of b is $b";fi The value of b is null. # b=1 # if [ -z "$b" ]; then echo "The value of b is null.";else echo "The value of b is $b.";fi The value of b is 1.2)用-n(not null的意思,不為空)
# a=1 # if [ -n "$a" ]; then echo "The value of a is $a.";else echo "The value of a is null.";fi The value of a is 1. # a= # if [ -n "$a" ]; then echo "The value of a is $a.";else echo "The value of a is null.";fi The value of a is null.?
知識點五:判斷某個進程是否存在
之前有用到過ps查看進程,但是需要結合grep,而且需要統計行數,其實還有一個更簡單的用法:
# sleep 100 & [1] 32744 # pgrep sleep 32744?
知識點六:殺死進程
前面有用到kill命令殺死進程,但是需要知道進程的pid。再介紹一個簡單的用法:
# sar 1 > /tmp/1.log & # killall sar [1]+ 已終止 sar 1 > /tmp/sar.log說明:killall和kill不同的地方在于killall可以直接跟進程名。killall也支持-9選項,有時候用killall殺死進程不好用,需要帶上-9,但是進程殺不死時,要慎用-9。
? 鄭州男科醫院哪家好:https://yyk.familydoctor.com.cn/21523/鄭州男科醫院排名:https://yyk.familydoctor.com.cn/21523/鄭州包皮手術多少錢:https://yyk.familydoctor.com.cn/21523/
本案例參考腳本
#!/bin/bash #檢測域名是否過期 #作者: #日期: #版本:v0.2 mail_u=admin@admin.com #當前日期時間戳,用于和域名的到期時間做比較 t1=`date +%s` #檢測whois命令是否存在,不存在則安裝whois包 is_install_whois() { which whois >/dev/null 2>/dev/null if [ $? -ne 0 ] then yum install -y whois fi } notify() { e_d=`whois $1 |grep 'Expiry Date' |awk '{print $4}' |cut -d 'T' -f 1` #上面的$1代表域名,遍歷循環出來的。 #如果e_d的值為空,則過濾關鍵詞'Expiration Time' if [ -z "$e_d" ] then e_d=`whois $1|grep 'Expiration Time' |awk '{print $3}'` fi #將域名過期的日期轉化為時間戳 e_t=`date -d "$e_d" +%s` #計算一周一共有多少秒 n=`echo "86400*7" |bc` e_t1=$[$e_t-$n] #過期時間一周前的時間戳 e_t2=$[$e_t+$n] #過期時間一周后的時間戳 if [ $t1 -ge $e_t1 ] && [ $t1 -lt $e_t ] then python mail.py $mail_u "Domain $1 will to be expired." "Domain $1 expire date is $e_d." fi if [ $t1 -ge $e_t ] && [ $t1 -lt $e_t2 ] then python mail.py $mail_u "Domain $1 has been expired." "Domain $1 expire date is $e_d." fi } #檢測上次運行的whois查詢進程是否存在 #若存在,需要殺死進程,以免影響本次腳本執行 if pgrep whois &>/dev/null then killall -9 whois fi is_install_whois for d in aaa.net aaa.com bbb.com aaa.cn ccc.com do notify $d & done轉載于:https://www.cnblogs.com/sushine1/p/11320884.html
總結
- 上一篇: 神庙逃亡2怎么退出登录(世界著名神庙有哪
- 下一篇: 你愿意加入App Store和Apple