1. 程式人生 > >python3操作linux視窗

python3操作linux視窗

可通過遠端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()