python3操作linux視窗
阿新 • • 發佈:2018-12-09
可通過遠端Linux主機配置檔案資訊連線到遠端主機自動操作各種服務 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/9/11 16:44 # @Author : qhh # @Site : # @File : pyshell.py # @Software: PyCharm # !/usr/bin/env python # -*- coding:utf-8 -*- # 查閱https://blog.csdn.net/qq_32502511/article/details/79849826 import paramiko import configparser import re import time # 獲取配置檔案資料 def get_cfg_data(cfg_path): cf = configparser.ConfigParser() cf.read(cfg_path, encoding='utf-8') # 獲取所有section,返回值為list secs = cf.sections() print('可輸入資訊列表%s' % secs) # # 獲取db中的所有屬性名 # dboption = cf.options('db') # print(dboption) # # 獲取db中的鍵值對 input_comm = input("輸入ip地址的最後一個(例如配置檔案中的為[host_169]則需要輸入169或者核對可輸入資訊列表檢視下劃線_後的數值是否存在):") if 'host_'+input_comm not in secs: print('輸入的資訊有誤系統自動退出!請檢查host.ini配置檔案中的中括號[]內是否包含了所輸入的%s' % input_comm) exit(0) dbitem = cf.items('host_'+input_comm) print(dict(dbitem)) # 獲取section為db,屬性名為db_pass的值 # input_comm = input("輸入ip地址的最後一個(例如配置檔案中的為[host_169]則需要輸入169):") # li = [] # print(cf.get('host_'+input_comm, 'host_ip')) # print(cf.get('host_'+input_comm, 'host_user')) # print(cf.get('host_'+input_comm, 'host_pw')) # li.append(cf.get('host_'+input_comm, 'host_ip')) # li.append(cf.get('host_'+input_comm, 'host_user')) # li.append(cf.get('host_'+input_comm, 'host_pw')) return dict(dbitem) # 定義一個類,表示一臺遠端linux主機 class Linux(object): # 通過IP, 使用者名稱,密碼,超時時間初始化一個遠端Linux主機 def __init__(self, ip, username, password, timeout=30): self.ip = ip self.username = username self.password = password self.timeout = timeout # transport和chanel self.t = '' self.chan = '' # 連結失敗的重試次數 self.try_times = 3 # 呼叫該方法連線遠端主機 def connect(self): while True: # 連線過程中可能會丟擲異常,比如網路不通、連結超時 try: self.t = paramiko.Transport(sock=(self.ip, 22)) self.t.connect(username=self.username, password=self.password) self.chan = self.t.open_session() self.chan.settimeout(self.timeout) self.chan.get_pty() self.chan.invoke_shell() # 如果沒有丟擲異常說明連線成功,直接返回 print(u'連線%s成功' % self.ip) # 接收到的網路資料解碼為str print(self.chan.recv(65535).decode('utf-8')) return # 這裡不對可能的異常如socket.error, socket.timeout細化,直接一網打盡 except Exception as e1: if self.try_times != 0: print(u'連線%s失敗,進行重試' % self.ip) self.try_times -= 1 else: print(u'重試3次失敗,結束程式') exit(1) # 斷開連線 def close(self): self.chan.close() self.t.close() # 傳送要執行的命令 def send(self, cmd): cmd += '\r' # 通過命令執行提示符來判斷命令是否執行完成 p = re.compile('[email protected]:.*?#') result = '' # 傳送要執行的命令 self.chan.send(cmd) # 回顯很長的命令可能執行較久,通過迴圈分批次取回回顯,執行成功返回true,失敗返回false while True: time.sleep(0.5) ret = self.chan.recv(65535) ret = ret.decode('utf-8') result += ret return result # 連線正常的情況 if __name__ == '__main__': # 獲取配置檔案中的資料 cfg_data = get_cfg_data('host.ini') host = Linux(cfg_data['host_ip'], cfg_data['host_user'], cfg_data['host_pw']) # 傳入Ip,使用者名稱,密碼 host.connect() while True: # result = host.send('ifconfig') # 傳送一個檢視ip的命令 # host.send('ifconfig') host.send("alias ls='ls --color=never'") host.send("alias ll='ls -l --color=never'") # 遍歷命令列表 for key, value in cfg_data.items(): print(key, value) if 'comm' in key: result = host.send(value) # print("返回的結果--") # print(result) input_com = input("輸入命令:") result = host.send(input_com) print("返回的結果--") print(result) host.close()