Python3 https证书有效期

#!/usr/bin/env python3
# -*-coding:utf8-*-

import re
import time
import subprocess
from datetime import datetime
from io import StringIO

def main(domain):
f = StringIO()
comm = f"curl -Ivs https://{domain} --connect-timeout 10"

result = subprocess.getstatusoutput(comm)
f.write(result[1])

m = re.search('start date: (.*?)\n.*?expire date: (.*?)\n.*?common name: (.*?)\n.*?issuer: CN=(.*?)\n', f.getvalue(), re.S)
start_date = m.group(1)
expire_date = m.group(2)
common_name = m.group(3)
issuer = m.group(4)

# time 字符串转时间数组
start_date = time.strptime(start_date, "%b %d %H:%M:%S %Y GMT")
start_date_st = time.strftime("%Y-%m-%d %H:%M:%S", start_date)
# datetime 字符串转时间数组
expire_date = datetime.strptime(expire_date, "%b %d %H:%M:%S %Y GMT")
expire_date_st = datetime.strftime(expire_date,"%Y-%m-%d %H:%M:%S")

# 剩余天数
remaining = (expire_date-datetime.now()).days

print('域名:', domain)
print('通用名:', common_name)
print('开始时间:', start_date_st)
print('到期时间:', expire_date_st)
print(f'剩余时间: {remaining}天')
print('颁发机构:', issuer)
print(remaining)
print('*'*30)

time.sleep(0.5)

if __name__ == "__main__":

domains = ['www.baidu.com']

for domain in domains:
main(domain)

调用jquery时,注意路径的引用

<!DOCTYPE html><html><head>
<meta charset="UTF-8">
<script src="/jquery.js"></script> //注意有/,加载效果失败
<script type="text/javascript">
$(document).ready(function(){
$(".flip").click(function(){
$(".panel").slideToggle("slow");
});
});
</script>
<style type="text/css">
div.panel,p.flip
{
margin:0px;
padding:5px;
text-align:center;
background:#e5eecc;
border:solid 1px #c3c3c3;
}
div.panel
{
height:120px;
display:none;
}
</style>
</head>
<body>
<div class="panel">
<p>学习前端课程</p>
<p>深入浅出前端系列</p>
</div>
<p class="flip">请点击这里</p>
</body>
</html>
<!DOCTYPE html><html><head>
<meta charset="UTF-8">
<script src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(".flip").click(function(){
$(".panel").slideToggle("slow");
});
});
</script>
<style type="text/css">
div.panel,p.flip
{
margin:0px;
padding:5px;
text-align:center;
background:#e5eecc;
border:solid 1px #c3c3c3;
}
div.panel
{
height:120px;
display:none;
}
</style>
</head>
<body>
<div class="panel">
<p>学习前端课程</p>
<p>深入浅出前端系列</p>
</div>
<p class="flip">请点击这里</p>
</body>
</html>
点击后上下切换

前端测试

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>New tec</title>
</head>
<body>
<div id="header">
<h1>四川省</h1>
</div>
<div id="nav">
成都<br>
德阳<br>
绵阳<br>
遂宁<br>
</div>
<div id="section">
<h1>CD</h1>
<p>
成都历史悠久,有“天府之国”、“蜀中江南”、“蜀中苏杭”的美称。据史书记载,大约在公元前5世纪中叶的古蜀国开明王朝九世时将都城从广都樊乡(双流)迁往成都,构筑城池。 关于成都一名的来历,据《太平环宇记》记载,是借用西周建都的历史经过,取周王迁岐“一年而所居成聚,二年成邑,三年成都”而得名成都。蜀语“成都”二字的读音就是蜀都。 “‘成’者‘毕也’‘终也’”,成都的含义“就是蜀国‘终了的都邑’,或者说‘最后的都邑’。五代十国时,后蜀皇帝孟昶偏爱芙蓉花,命百姓在城墙上种植芙蓉树,花开时节, 成都“四十里为锦绣”,故成都又被称为芙蓉城,简称“蓉城”。2001年2月8日出土的金沙遗址,已经将成都建城历史从公元前311年提前到了公元前611年。
</p>
<p>

</div>
<div id="footer">
Copyright www.tcc.pub
</div>
</body>
<style>
#header {
background-color:darkblue;
color:white;
text-align:center;
padding:10px;
}
#nav {
line-height:30px;
background-color:#eeeeee;
height:400px;
width:100px;
float:left;
padding:20px;
}
#section {
width:350px;
float:left;
padding:10px;
}
#footer {
background-color:black;
color:white;
clear:both;
text-align:center;
padding:5px;
}
</style>
</html>

创业者

创业者不一定是CEO(首席执行官),创业者可以是一个产品经理,创业者可以是一个程序员,创业者可以是一个设计师,创业者可以是一个产品经理,只要你拥有这个创业的梦想

python3天数转日期

!/usr/bin/env python3
– coding:utf-8 –
import time
import os
import sys
print()
input_num_value = int(input(“请输入转换的天数:”))
time_convert_value = input_num_value * 24 * 60 * 60 #天转秒
time_cur_value = time.time() #当前日期的秒
time_convert_mes = time_cur_value + time_convert_value #求秒+当前秒=和秒
time_day = time.gmtime(time_convert_mes) #转换日期
time_day_format = time.strftime(“%Y-%m-%d %H:%M:%S”,time.gmtime(time_convert_mes))
print()
print(‘天数转换后的年月日: {}’.format(time_day_format))
print()

FastDFS文件同步机制简介

   FastDFS文件同步采用binlog异步复制方式。storage server使用binlog文件记录文件上传、删除等操作,根据binlog进行文件同步。binlog中只记录文件ID和操作,不记录文件内容。下面给出几行binlog文件内容示例:

1572660675 C M00/00/00/oYYBAF285cOIHiVCAACI-7zX1qUAAAAVgAACC8AAIkT490.txt

1572660827 c M00/00/00/oYYBAF285luIK8jCAAAJeheau6AAAAAVgABI-cAAAmS021.xml

1572660911 D M00/00/00/oYYBAF285cOIHiVCAACI-7zX1qUAAAAVgAACC8AAIkT490.txt

1572660967 d M00/00/00/oYYBAF285luIK8jCAAAJeheau6AAAAAVgABI-cAAAmS021.xml

  从上面可以看到,binlog文件有三列,依次为时间戳、操作类型和文件ID(不带group名称)。

  文件操作类型采用单个字母编码,其中源头操作用大写字母表示,被同步的操作为对应的小写字母。文件操作字母含义如下:

    C :上传文件(upload)

    D:删除文件(delete)

    A:追加文件(append)

    M:部分文件更新(modify)

    U:整个文件更新(set metadata)

    T:截断文件(truncate)

    L:创建符号链接(文件去重功能,相同内容只保存一份)

  同组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行。文件同步只在同组内的storage server之间进行,采用push方式,即源头服务器同步给本组的其他存储服务器。对于同组的其他storage server,一台storage server分别启动一个线程进行文件同步。

  文件同步采用增量方式,记录已同步的位置到mark文件中。mark文件存放路径为 $base_path/data/sync/。mark文件内容示例:

binlog_index=3

binlog_offset=382

need_sync_old=1

sync_old_done=1

until_timestamp=1571976211

scan_row_count=2033425

sync_row_count=2033417

  采用binlog的异步复制方式,必然存在同步延迟的问题,比如mysql的主从数据同步。下一篇文章将介绍FastDFS是如何解决文件异步复制带来的延迟问题,敬请期待。

  最后留给大家一个问题,为什么binlog记录的文件操作类型有大小写的两套呢(如C和c、D和d等)?

awk数字过滤

netstat -lntp|awk {'print $4'}|awk -F ':' '{if ($NF~/^[0-9]$/) print $NF}'|sort|uniq 
netstat -lntp|awk '{print $4}'|awk -F ':' '/[0-9]/{print $NF}'|sort|uniq
netstat -lntp|awk {'print $4'}|awk -F ':' '{print $NF}'|egrep "^[0-9]$"|sort|uniq

结果:

22
3306

为什么执行这句无任何显示

netstat -lntp|awk {‘print $4’}|awk -F ‘:’ ‘/^[0-9]*$/{print $1}’|sort|uniq

但在txt文本又能生效

[root@oldboy scripts]# cat test.txt 
(only
Local
22
a3306
22
3306
4473f
56789
[root@oldboy scripts]#  cat test.txt|awk -F ':' '/[0-9]/{print $1}'|sort|uniq 
22
3306
4473f
56789
a3306
[root@oldboy scripts]#  cat test.txt|awk -F ':' '/^[0-9]$/{print $1}'|sort|uniq 
[root@oldboy scripts]# cat test.txt|awk -F ':' '/^[0-9]*$/{print $1}'|sort|uniq
22
3306
56789

总结:

  • netstat 不需要多次匹配
  • cat 需要多次匹配
  • netstat 是一行处理 cat 是多行处理

Linux的net.ipv4.tcp_timestamps参数

Q1

在家里无法打开公司的网站,经过各种测试,利用ping、dig域名,然后curl,都正常。但是网站依然无法打开。最后,采用抓包的方式,从包中看到syn-ack没有返回,然后就百度。

经过查找net.ipv4.tcp_timestamps=1,启用了时间戳。

原理如下:
tcp三次握手问题,当有一个用户的时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息。用户表现无法正常完成tcp3次握手,从而不能打开web页面。在业务闲时,如果用户nat的端口没有被使用过时,就可以正常打开;业务忙时,nat端口重复使用的频率高,很难分到没有被使用的端口,从而产生这种问题。

解决:

net.ipv4.tcp_timestamps = 0

然后syctlp -p生效即可。

Q2

由于乱序,当发送rst包到对端的时候,连接还是establish的rst后,链接就会断开, 后来使得net.ipv4.tcp_timestamps = 0,问题解决。

mysql 案例

create table student (
id int(4) not null,
name char(20) not null,
age tinyint(2) not null,
dept varchar(16) not null
);

create database sns; use sns; set names gbk; create table `subject_comment_manager` ( `subject_comment_manager_id` bigint(12) not null auto_increment comment ‘主键’, `subject_type` tinyint(2) not null comment ‘素材类型’, `subject_primary_key` varchar(255) not null comment ‘素材主键’, `subject_title` varchar(255) not null comment ‘素材名称’, `edit_user_nick` varchar(64) not null comment ‘修改人’, `edit_user_time` timestamp null default null comment ‘修改时间’, `edit_comment` varchar(255) default null comment ‘修改的理由’, `state` tinyint(1) not null default ‘1’ comment ‘0 代表关闭,1 代表正常’, primary key (`subject_comment_manager_id`), key `IDX_PRIMARYKEY` (`subject_title`(32)), #括号内的32表示对前32个字符做前缀索引。 key `IDX_SUBJECT_TITLE` (`subject_title`(32)), key `index_nick_type` (`edit_user_nick`(32),`subject_type`) #联合索引,此行为新加的,用于给大家讲解的,实际表语句内没有此行。 ) engine=innodb auto_increment=1 default charset=utf8;

=====================联表查询====================
create table student(
Sno int(10) not null comment ‘学号’,
Sname varchar(16) not null comment ‘姓名’,
Ssex char(6) not null comment ‘性别’,
Sage tinyint(2) not null default ‘0’ comment ‘学生年龄’,
Sdept varchar(16) default null comment ‘学生所在系别’,
primary key (Sno),
key index_Sname(Sname)
) engine=innodb auto_increment=1 default charset=utf8;

create table course(
Cno int(10) not null comment ‘课程号’,
Cname varchar(64) not null comment ‘课程名’,
Ccredit tinyint(2) not null comment ‘学分’,
primary key (Cno)
) engine=innodb auto_increment=1 default charset=utf8;

create table SC(
SCid int(12) not null auto_increment comment ‘主键’,
Cno int(10) not null comment ‘课程号’,
Sno int(10) not null comment ‘学号’,
Grade tinyint(2) not null comment ‘学生成绩’,
primary key (SCid)
) engine=innodb default charset=utf8;

随便插入学生数据

insert into student values(0001,’hognzhi’,’male’,30,’jisuanji’),(0002,’wammg’,’male’,30,’jisuanji’) ,(0003,’oldboy’,’male’,28,’wuliu’) ,(0004,’ts’,’male’,29,’jisuanji’) ,(0005,’oldgirl’,’female’,30,’jisuanji’) ,(0006,’yuany’,’female’,22,’nurse’);

insert into course values(1001,’Linuxyunwei’,3),(1002,’Linuxyunwei’,5),(1003,’Linuxyunwei’,4),(1004,’Linuxyunwei’,4),(1001,’Linuxyunwei’,3);

insert into SC(Sno,Cno,Grade) values(0001,1001,4);
insert into SC(Sno,Cno,Grade) values(0001,1002,3);
insert into SC(Sno,Cno,Grade) values(0001,1003,1);
insert into SC(Sno,Cno,Grade) values(0001,1003,6);

insert into SC(Sno,Cno,Grade) values(0002,1001,3);
insert into SC(Sno,Cno,Grade) values(0002,1002,2);
insert into SC(Sno,Cno,Grade) values(0002,1003,2);
insert into SC(Sno,Cno,Grade) values(0002,1003,8);

insert into SC(Sno,Cno,Grade) values(0003,1001,4);
insert into SC(Sno,Cno,Grade) values(0003,1002,4);
insert into SC(Sno,Cno,Grade) values(0003,1003,2);
insert into SC(Sno,Cno,Grade) values(0003,1003,8);

insert into SC(Sno,Cno,Grade) values(0004,1001,1);
insert into SC(Sno,Cno,Grade) values(0004,1002,1);
insert into SC(Sno,Cno,Grade) values(0004,1003,2);
insert into SC(Sno,Cno,Grade) values(0004,1003,3);

insert into SC(Sno,Cno,Grade) values(0005,1001,5);
insert into SC(Sno,Cno,Grade) values(0005,1002,3);
insert into SC(Sno,Cno,Grade) values(0005,1003,2);
insert into SC(Sno,Cno,Grade) values(0005,1003,9);

联表查询
select student.Sno,student.Sname,course.Cname,SC.Grade from student, course, SC where student.Sno=SC.Sno and course.Cno=SC.Cno;
select student.Sno,student.Sname,course.Cname,SC.Grade from student, course, SC where student.Sno=SC.Sno and course.Cno=SC.Cno order by Sno;
在where后面建索引

explain 查询select 查询语句执行计划
就是查询这个语句,能不能走索引?

use oldboy;
drop table test;
create table test(
id int(4) not null auto_increment,
name char(20) not null,
primary key (id)
);

insert into test values(1,’oldboy’),(2,’oldgir’),(3,’inca’),(4,’zuma’),(5,’kaka’);

select * from test where name=’oldboy’;

explain select * from test where name=’oldboy’;

explain select * from test where name=’oldboy’\G;

create index index_name on test(name);

建索引和没有建索引的区别
mysql> explain select * from test where name=’oldboy’\G
* 1. row *
id: 1
select_type: SIMPLE
table: test
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 5
Extra: Using where
1 row in set (0.00 sec)

mysql> create index index_name on test(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> explain select * from test where name=’oldboy’\G
* 1. row *
id: 1
select_type: SIMPLE
table: test
type: ref
possible_keys: index_name
key: index_name
key_len: 60
ref: const
rows: 1
Extra: Using where; Using index
1 row in set (0.00 sec)