如果你想做一个网站,首先需要购买一个域名,与其说是购买不如说是租用,因为你要想使用这个域名,每年都需要缴纳一笔费用。既然是租用,所以就有期限,在到期前没有续费,则该域名会被收回,其他人可以注册并使用这个域名。

当我们名下域名非常多的时候,则很容易忘记为这些域名续费从而导致过期并回收。

本案例的需求是,写一个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.log

kill命令语法很简单,直接在后面加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。

本案例参考脚本

#!/bin/bash
#检测域名是否过期
#作者:
#日期:
#版本:v0.2mail_u=admin@admin.com
#当前日期时间戳,用于和域名的到期时间做比较
t1=`date +%s`#检测whois命令是否存在,不存在则安装whois包
is_install_whois()
{which whois >/dev/null 2>/dev/nullif [ $? -ne 0 ]thenyum install -y whoisfi
}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" ]thene_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 ]thenpython mail.py $mail_u "Domain $1 will to be expired." "Domain $1 expire date is $e_d."fiif [ $t1 -ge $e_t ] && [ $t1 -lt $e_t2 ]thenpython mail.py $mail_u "Domain $1 has been expired." "Domain $1 expire date is $e_d."fi
}#检测上次运行的whois查询进程是否存在
#若存在,需要杀死进程,以免影响本次脚本执行
if pgrep whois &>/dev/null
thenkillall -9 whois
fiis_install_whoisfor d in aaa.net aaa.com bbb.com aaa.cn ccc.com
donotify $d &
done

案例十、检测域名是否到期相关推荐

  1. 10. 检测域名是否到期

    任何网站对外提供服务,都需要有一个域名,就像每个人都有人名,网站的名字就是这个域名.如果你想做一个网站,首先就需要租借一个域名. 当我们管理的域名数量非常多的时候,就很容易忘记为这些域名续期从而导致过 ...

  2. 域名会到期吗?到期的域名会怎么处理呢?

    域名多久到期? 域名注册时,有时长选择,最低一年,最高十年.比如选择注册一年,那么一年后到期:选择注册三年,那么三年后到期. 域名到期后,还能使用吗? 域名到期后,如果没有及时续费,那么域名将无法使用 ...

  3. linux shell 域名 ip,Shell脚本一种检查Linux中域名和IP地址所有权信息、检查多个域名的到期日期工具...

    Shell脚本一种检查Linux中域名和IP地址所有权信息.检查多个域名的到期日期工具 jwhois是一个命令行实用程序,可从whois服务器(whois数据库)中获取有关域名所有权的信息. Whoi ...

  4. 中国十大域名注册虚拟主机提供商排行榜

    中国的IDC行业发展已达数十万,其发展潜力不可小视,随着中小企业数量的不断增加,域名注册虚拟主机等产业受到了一些服务商的青睐,欲分得一份羹.但随着IDC服务商数量的不断增加,市场较难监管,而某些不负责 ...

  5. 域名证书到期监控告知

    域名证书到期提前监控告知 通过该网站进行服务证书监控 证书到期监控:https://letsmonitor.org/contacts 通过邮件告警通知 个人用户:baolin2200@gmail.co ...

  6. java基础-数组-案例练习-检测一个字符串是否为回文 回文字符串是指正着读和反着读该字符串都是相同拼写

    大家好,今天又来分享新案例啦~检测一个字符串是否为回文                 回文字符串是指正着读和反着读该字符串都是相同拼写,比如"radar"."level ...

  7. 多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化

    多视图CAD检测系统乳腺X线摄影基于案例的检测性能优化 介绍 通常乳腺肿块的检测基于双视图乳腺摄影,医生在阅片是会将所有可用视图的信息组合在一起,他们比较MLO和CC视图,寻找不对称性并评估相对于先前 ...

  8. zabbix 监控域名注册到期时间

    前言 一.运行环境 二.操作步骤 1.Centos添加whois查询功能 2.创建SH脚本 3.设置相关配置 总结 前言 搭建好了zabbix监控平台后,想着充分应用平台.公司注册的域名一般都三年以上 ...

  9. php判断域名是否解析源码,检测域名是否被墙API接口源码

    昨日博客有个人问有没有检测域名被墙的. 今儿根据易名网的接口写了一个. 速度还可以的,大家可以拿来用用! /* * 检测域名是否被墙 * www.aeink.com */ //查询域名 $domain ...

最新文章

  1. mysql出现1499错误_连接MySQL时出现1449与1045异常解决办法
  2. 尝试在centos5下运行phantomjs2
  3. Python入门学习---第四天
  4. 『重构--改善既有代码的设计』读书笔记----Remove Middle Man
  5. 利用python爬虫(part8)--Xpath路径表达式
  6. Linux内核设计与实现---系统调用
  7. python设计一个爱心_python画一个玫瑰和一个爱心
  8. Atitit. null错误的设计 使用Optional来处理null
  9. asp.net 利用DirectoryEntry来验证用户以及开机密码
  10. 网络安全和CTF相关内容
  11. 深度内幕丨揭秘积分墙最新反作弊
  12. 一个月攻克托业--复旦大学考生
  13. mysql红黑联盟_MySQL - mysql数据库栏目 - 红黑联盟
  14. 收藏behavior designer中文教程
  15. 按照ID降序排列方法
  16. Linux驱动——mmc sd card初始化流程(十一)
  17. PS 2019 Mac版 自学入门系列(十)—— 自定义黑白
  18. Graph控件绘制图形从左往右显示方法,默认是从右往左
  19. L016-老男孩Linux高端运维课程-linux系统文件权限体系实战深入讲解
  20. 树莓派触摸屏显示旋转+触摸旋转

热门文章

  1. 基于深度学习的三维重建算法综述
  2. Tomcat6中web项目部署路径webapps和wtpwebapps的区别
  3. u盘容量变小了是什么原因?怎么恢复数据?
  4. 轻易解决VMware 虚拟机中被提示“请不要在虚拟机中运行此程序“
  5. GNU/Linux闲话
  6. 不同的「火」在舌頭上的表現也不一樣
  7. opencv模拟景深效果
  8. 整数无序数组求第k大数
  9. 面试篇1:C/C++,Linux
  10. python入门——Python的两种编程语言:交互式和文件式