检测域名是否到期

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

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

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

   郑州男科医院哪家好: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jax-ws cxf_走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

jax-ws cxf对于服务器核心Java开发人员来说&#xff0c;向世界“展示”的唯一方法是使用API​​。 今天的帖子都是关于JAX-RS的 &#xff1a;使用Java编写和公开RESTful服务。 但是&#xff0c;我们不会使用涉及应用程序服务器&#xff0c;WAR打包以及诸如此类的传统的重量级方…

问题 1046: [编程入门]自定义函数之数字后移

题目描述有n个整数&#xff0c;使前面各数顺序向后移m个位置&#xff0c;最后m个数变成前面m个数。写一函数&#xff1a;实现以上功能&#xff0c;在主函数中输入n个数和输出调整后的n个数。输入输入数据的个数n n个整数 移动的位置m输出移动后的n个数样例输入10 1 2 3 4 5 6 7…

Reliable Multicast Programming(PGM)协议

Reliable Multicast Programming (PGM)实际通用可靠多播协议&#xff0c;在某种程度上保证多播的可靠性。是IP上层协议&#xff0c;和TCP还有UDP同级&#xff0c;工作在传输层。 在组播传输视频项目中&#xff0c;发现在网络较差的时候&#xff0c;组播传输视频性能下降迅猛&am…

P1488 肥猫的游戏

P1488 肥猫的游戏https://www.luogu.org/problem/P1488 博弈论一个三角形&#xff0c;只有三种情况&#xff1a;1邻接&#xff0c;2邻接&#xff0c;3邻接主要是2邻接的情况比较麻烦边<0,n-1>需要特判一下 #include <iostream> #include <cstdio> #include &…

使用OAuth2令牌的安全REST服务

1.简介 在本教程中&#xff0c;我们将介绍如何将Spring Security与OAuth结合使用以保护REST服务。 在演示应用程序中&#xff0c;可以使用路径模式&#xff08; / api / ** &#xff09;访问服务器上受保护的REST资源&#xff0c;以便基于该路径的请求URL映射到不同的控制器方法…

java 内联调用深度_Java中内联虚拟方法调用的性能

java 内联调用深度总览 动态编译的好处之一是它能够支持在虚拟方法代码上的广泛方法内联。 内联代码可提高性能时&#xff0c;代码仍必须检查类型&#xff08;以防由于优化而更改了类型&#xff09;或在多个可能的实现之间进行选择。 这导致了问题。 通过接口调用的方法的多个…

组件切换方式(Vue.js)

这里&#xff0c;我用一个注册登录两组件的切换实例来演示&#xff1a; 切换方式一 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><title>独秀不爱秀</title> </head><body><div …

在GWT中序列化/反序列化Json

JSON和GWT 最近&#xff0c; GWT用户小组中进行了有趣的讨论 &#xff0c;涉及在客户端对JSON进行序列化/反序列化的最佳实践。 这篇文章旨在突出其重点。 到目前为止&#xff0c;在GWT中有三种将对象转换为JSON并从客户端转换回JSON的方法&#xff1a; gwt-jackson框架&#…

NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」

建造城市 题解 先思考一个简单问题 10个$toot$ 放进5间房屋&#xff0c;每个房屋至少有1个$toot$&#xff0c;方案数 思考&#xff1a;插板法&#xff0c;$10$个$toot$有$9$个缝隙&#xff0c;$5$间房屋转化为$4$个挡板&#xff0c;放在toot缝隙之间得到$C_{9}^{4}$ 10个$toot$…

弹簧和线程:TaskExecutor

在Web应用程序中使用线程并不常见&#xff0c;尤其是当您必须开发长期运行的任务时。 考虑到spring&#xff0c;我们必须格外注意并使用它已经提供的工具&#xff0c;而不是生成我们自己的线程。 我们希望线程由spring管理&#xff0c;因此能够在不产生任何影响的情况下使用应…

数位dp从会打模板到不会打模板

打了几个数位$dp$&#xff0c;发现自己除了会打模板之外没有任何长进&#xff0c;遇到非模板题依然什么都不会 那么接下来这篇文章将介绍如何打模板&#xff08;滑稽&#xff09; 假设我们要处理$l----r$ 采用记忆化搜索的方式&#xff0c;枚举$<r$每一种情况&#xff0c;枚…

javafx简单吗_JavaFX即将推出您附近的Android或iOS设备吗?

javafx简单吗已经有大新闻最近在世界上的JavaFX的关于JavaFX的是许多更多的组件开源&#xff0c;开源的广告在2012 JavaOne大会 。 在2月的开放源代码更新中 &#xff0c; Richard Bair编写了一份JavaFX项目表&#xff0c;该表在撰写本文时&#xff08;2013年2月11日&#xff0…

【webrtc】webrtc的rtp重传代码分析

pgm不太能用&#xff0c;没有想象中的可靠&#xff0c;重传机制貌似仍然使用组播重传&#xff0c;丢包率80%的网络感觉没啥改进&#xff0c;如果有所好转延迟估计也是个不小的问题。 后听说rtp也有nack机制&#xff0c;webrtc基于rtp实现了重传在一定程度上保证可靠性。 在各路…

了解java.nio.file.Path – 1

介绍 Java的最后几个发行版本&#xff0c;即Java 7&#xff0c;Java 8和即将到来的Java 9&#xff0c;具有许多功能&#xff0c;这些功能使Java开发人员的生活更加轻松。 &#xff08;我知道Java 9会使它变得更困难&#xff0c;但是只有在您采用新的范例时才可以。之后&#xf…

socket-01

对于所有的Web应用&#xff0c;本质上其实就是一个socket服务端&#xff0c;用户的浏览器其实就是一个socket客户端 转载于:https://www.cnblogs.com/yanhuaqiang/p/11329925.html

ActionScript3学习笔记2-包

在 ActionScript 3.0 中&#xff0c;包是用命名空间实现的&#xff0c;但包和命名空间并不同义。在声明包时&#xff0c; 可以隐式创建一个特殊类型的命名空间并保证它在编译时是已知的。显式创建的命名空间在 编译时不必是已知的。 下面的示例使用 package 指令来创建一个包含…

grep v grep_使用grep4j轻松测试分布式组件上的SLA

grep v grep因此&#xff0c;您的分布式体系结构如下图所示&#xff0c;您刚刚从企业那里收到了一项要求&#xff0c;以确保生产者发送并随后传输到下游系统&#xff08;消费者&#xff09;的消息的SLA必须快且永远不会慢于此。 400毫秒。 要求说&#xff1a; 从生产者发送到…

得到指定进程所有窗口。显示 影藏 置顶。

这里使用一个外挂程序测试&#xff0c;因为外挂程序没有做功能限制的处理 只是做了 窗口影藏。 全局变量 HWND hwnd[100]{0};int number0;DWORD Tpid0; 局部变量 char username[1028]; 先找到进程ID 1 HWND SelectPor() 2 { 3 bool isYesfalse; 4 string porcessName&q…

jquery部分方法

offset([coordinates]) 概述&#xff1a;获取匹配元素在当前视口的相对偏移。返回的对象包含两个整型属性&#xff1a;top 和 left。此方法只对可见元素有效。 比如&#xff0c;获取第二段的偏移&#xff1a; HTML 代码: <p>Hello</p><p>2nd Paragraph</p…

JUnit 5扩展模型的生命周期

JUnit5最终版本即将来临 &#xff08;当前是M4&#xff09;&#xff0c;我已经开始研究如何编写扩展。 在JUnit5中 &#xff0c;您没有使用Runners &#xff0c; Rules &#xff0c; ClassRules等&#xff0c;而是只有一个Extension API来实现自己的扩展。 JUnit5提供了多个接…