ssh-expire-time.py:查找~/.ssh/config配置文件,排列主机过期信息Python实现

stevehe 2020年11月06日 255次浏览
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#列出~/.ssh/config主机到期时间
#自用ssh-expire-time命令python实现版本
#原始ssh-expire-time为shell脚本实现,参看:/v/bin/ssh-expire-time
import sys
import os
import re
import time

foundCount=0
allHostInfo=[]
allExpireTime=[]

def readHostsInfo(findflag,findNum=None):
	global foundCount
	global allHostInfo
	global allExpireTime
	with open(sshConfigFile,"r") as read_f:
		Tag=False
		findExpire=False
		allHostInfo=[]
		HostInfo=[]
		for num,line in enumerate(read_f.readlines(),1):
			if Tag==True and re.match(r'[ ]*Host ',line,re.I):
				Tag=False
				if findExpire==True:
					allHostInfo.append(HostInfo)
					findExpire=False
			if Tag==False and re.match(r'Host .*',line,re.I):
				Tag=True
				HostInfo=[]
				HostInfo.append(line)
				continue
			if Tag==True:
				if re.match(r'.*#[ ]*到期时间.*',line,re.I):
					findExpire=True
					if findflag=="all":							
						foundCount+=1
						allExpireTime.append(line)
					elif findflag=="m":
						timeRegexp=time.strftime("%Y-%m", time.localtime())
						timeRegexp=timeRegexp.replace("-0","-0?",1)
						if not re.match(r'.*'+timeRegexp+'[^0-9]+.*',line,re.I):
							HostInfo=[]
							Tag=False
							findExpire=False
							continue
						else:
							HostInfo.insert(0,line)
							foundCount+=1
					elif findflag=="n":
						nowTime=time.localtime()
						nowYear=nowTime.tm_year
						nextMonth=nowTime.tm_mon+1
						if nextMonth>12:
							nextMonth=1
							nowYear+=1
						nextMonth=str(nextMonth).zfill(2)
						timeRegexp="{year}-{month}".format(year=nowYear,month=nextMonth)
						timeRegexp=timeRegexp.replace("-0","-0?",1)
						if not re.match(r'.*'+timeRegexp+'[^0-9]+.*',line,re.I):
							HostInfo=[]
							Tag=False
							findExpire=False
							continue
						else:
							HostInfo.insert(0,line)
							foundCount+=1
				HostInfo.append(line)
	return
	
def printUsage():
	print("""
    /v/bin/ssh-expire-time.py
    查询所有主机到期时间,按日期顺序排列
    参数一可附加参数 (month/m) 查看当月到期主机详情;
    参数一可附加参数 (next/n) 查看下月到期主机详情;
    参数二可指定最多列出的主机,缺省为-1,即列出全部匹配主机;
    Example:ssh-expire-time.py m 或 ssh-expire-time.py n;
    Example:ssh-expire-time.py m 2 (匹配两次,只显示到期前两个)	
	""")
	return

sshConfigFile="~/.ssh/config"
sshConfigFile=os.path.expanduser(sshConfigFile)

if len(sys.argv)<2 or (len(sys.argv)==2 and (str(sys.argv[1]).lower()=="--help" or str(sys.argv[1]).lower()=="-h")):
	printUsage()
	readHostsInfo('all')
	if len(allExpireTime)>0:
		allExpireTime.sort(key=None, reverse=False)
		for expireTime in allExpireTime:
			print(expireTime,end="")
	sys.exit(0)
elif len(sys.argv)==2:
	findflag=str(sys.argv[1]).lower()
	findNum=None
elif len(sys.argv)==3:
	findflag=str(sys.argv[1]).lower()
	findNum=int(sys.argv[2])
	
if not (findflag=="m" or findflag=="n"):
	print("参数错误!")
	printUsage()
	sys.exit(0)
	
readHostsInfo(findflag,findNum)
allHostInfo.sort()

suffixText=""
if findNum!=None and findNum<len(allHostInfo):
	allHostInfo=allHostInfo[:findNum]
	suffixText=",显示前 %d 个"%findNum

for Host in allHostInfo:
	Host.pop(0)
	print("".join(Host))
	
if foundCount>1:
	print("共找到主机 %s 个%s"%(foundCount,suffixText))
	
print("\nssh-expire-time.py执行完毕;Python版本:%s"%sys.version)


sp20201106_005822_438.png