遇到的問題
最近工作中需要維護(hù)一批項(xiàng)目中使用的linux服務(wù)器柄瑰,我需要及時(shí)的知道這些服務(wù)器能不能正常連接,以便及時(shí)聯(lián)系實(shí)驗(yàn)室管理員進(jìn)行處理泌霍。這批服務(wù)器都是使用ssh的方式登陸瓮钥,如果通過ssh客戶端逐個(gè)登陸去檢查的話不僅耗時(shí),而且鼠標(biāo)不停的點(diǎn)來點(diǎn)去會(huì)讓我心情煩躁烹吵。有沒有更好的方式來完成這個(gè)工作哪?答案當(dāng)然是肯定的桨武。
可以使用python第三方模塊Paramiko(python SSH module)來實(shí)現(xiàn)服務(wù)器的批量ssh登陸檢測(cè)肋拔,使用該模塊只要寫一些簡(jiǎn)單的python代碼就能做到這個(gè)訴求,而且還可以執(zhí)行l(wèi)inux命令呀酸,你可以根據(jù)自己的實(shí)際的訴求去編寫自己的python代碼凉蜂,本文僅示例批量服務(wù)器的ssh登陸檢測(cè),系統(tǒng)環(huán)境為windows性誉。
安裝Paramiko模塊
打開cmd窿吩,執(zhí)行pip命令安裝Paramiko模塊
pip install paramiko
批量ssh登陸檢查
- 在電腦上創(chuàng)建一個(gè)目錄,在該目錄下創(chuàng)建兩個(gè)文件servers.txt, connect.py错览。
servers.txt用來存放服務(wù)器ip及ssh登陸賬戶等信息纫雁,connect.py中的python代碼讀取servers.txt中的參數(shù)信息逐個(gè)進(jìn)行ssh登陸檢查并記錄連接日志信息。
servers.txt文件內(nèi)容按照如下示例格式倾哺,每一行包含一個(gè)服務(wù)器的ip轧邪、ssh登陸名刽脖、ssh登陸密碼信息,以空格分隔:
192.168.31.21 username password
192.168.31.22 username password
192.168.31.22 username password
connect.py代碼如下:
import paramiko
"""
Server對(duì)象用來定義server的ip忌愚、用戶名曲管、密碼以及連接日志等屬性,
包含connect方法用于ssh登陸, run_cmd方法用于執(zhí)行l(wèi)inux命令
"""
class Server():
def __init__(self, ip, username, password):
self.username = username
self.password = password
self.ip = ip
self.connect_result = ""
# ssh登陸并反饋連接成功或失敗信息
def connect(self):
conn = paramiko.SSHClient()
conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
conn.connect(self.ip, username=self.username, password=self.password)
self.connection = conn
self.connect_result = "Connect Server {0} {1} {2} Successfully!\n".format(
self.ip, self.username, self.password)
except:
self.connect_result = "Connect Server {0} {1} {2} Failed!\n".format(
self.ip, self.username, self.password)
#不能正常連接的server打印信息到控制臺(tái)
print(self.connect_result)
return self.connect_result
# 該方法運(yùn)行建立連接后執(zhí)行l(wèi)inux命令
def run_cmd(self, command):
if self.connection is None:
print("Please run connect")
raise ValueError("Not connected")
(stdin, stdout, stderr) = self.connection.exec_command(command)
return stdout.read()
# 從文件讀取servers信息ip 用戶名 密碼
def get_all_servers_login_info(server_file="./servers.txt"):
try:
f = open(server_file)
all_servers = f.read();
except:
print("ERROR: 讀取文件{0}失敗".format(server_file))
finally:
f.close()
all_servers = all_servers.split('\n')
ssh_list = []
for ssh in all_servers:
if (len(ssh) > 0):
ssh_list.append(ssh.split())
return ssh_list
if __name__ == '__main__':
# 讀取servers.txt中的ip username password信息
all_servers_info = get_all_servers_login_info()
# 記錄ssh登陸日志信息
connection_log = ""
# 逐個(gè)檢查每個(gè)server ssh登陸情況
for server in all_servers_info:
ip, username, password = server[0], server[1], server[2]
conn = Server(ip, username, password)
connection_log += conn.connect()
# 將所有服務(wù)器ssh登陸檢查信息寫入日志文件
log_file = open("connect_result.log", 'w')
log_file.write(connection_log)
log_file.close()
- 如何執(zhí)行批量檢測(cè)硕糊?
打開cmd命令提示符院水,cd至connect.py文件所在的目錄,執(zhí)行命令后就會(huì)在當(dāng)前目錄下生成日志文件connect_result.log简十,其中記錄了所有服務(wù)器的ssh登陸成功與否的信息檬某,如果有未能成功登陸的server會(huì)在控制臺(tái)窗口直接打印輸出。
python connect.py
每次都打開cmd勺远,然后cd到指定目錄橙喘,然后手工輸入python connect.py命令,也挺繁瑣的胶逢,可以在connect.py文件所在目錄下創(chuàng)建名為startup.bat的批處理文件厅瞎,文本方式打開,輸入如下保存初坠,然后直接雙擊startup.bat就可以執(zhí)行ssh登陸檢測(cè)了和簸。
echo "開始批量ssh登陸檢測(cè)..."
python connect.py
pause