我的mentor有个小需求,说是要检测公有云上的master节点是否能ssh连上服务器,然后我这个弱弱的实习生就想到了个法子,这个法子分三个步骤:
- ping,可能不在同一个vpc或者vpc没有打通,所以先试试能不能ping通
- 22端口,可能有安全组的设置,把22端口给禁用了,所以要试试22端口通不通
- ssh免密连接,都3202年了,肯定都是要免密登录上服务器,这年头谁还用密码啊
但是无奈何,服务器的数量有点小多,如果有大几百台或上千台呢?那总不能一台一台手动测试吧
所以咱就是打算用Python的线程池(伪),批量模拟ping、port和ssh免密的测试
首先是最简单的ping,咱这里就是直接使用第三方库ping3,使用pip3 install ping3就可以使用,然后包装成一函数
import ping3
def ping_test(ip):
return bool(ping3.ping(ip))
22端口咱们就使用socket进行检测,timeout设置为10s,如果超过10s没有回复,就判定为不通
import socket
def port_test(ip, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
result = sock.connect_ex((ip, port))
sock.close()
return not bool(result)
ssh连接咱们就使用os.system执行命令的方式模拟登录
import os
def ssh_test(ip, timeout=10):
cmd = "ssh " \
f"-o PasswordAuthentication=no " \
f"-o StrictHostKeyChecking=no " \
f"-o BatchMode=yes " \
f"-o ConnectTimeout={timeout} " \
f"root@{ip} 'exit'"
return not bool(os.system(cmd))
核心的三个检测方法就是这样啦!多线程或多进程的写法就自行解决咯