1. 程式人生 > >python 使用paramiko, pymysql實現批量管理服務器

python 使用paramiko, pymysql實現批量管理服務器

python paramiko pymysql threading模塊實現批量管理主機

使用paramiko,pymysql批量管理主機, 用戶信息,及主機信息存在數據庫中
例子:
#!/usr/bin/python
# --*-- coding:utf-8 --*--
import paramiko
import pymysql
from threading import Thread, RLock
import sys

def connect_user_tb():
    """返回執行sql結果"""
    conn = pymysql.Connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, password=‘aixocm‘, database=‘oldboy‘, charset=‘utf8‘)
    cursor = conn.cursor()
    cursor.execute(‘select user_tb.id,username,passwd,email,deptment_tb.name from user_tb left join deptment_tb on user_tb.deptId=deptment_tb.id‘)
    db_res = cursor.fetchall()
    cursor.close()
    conn.close()
    return db_res

def auth():
    """用戶登錄"""
    count = 0
    while count < 3:
        username = input("請輸入用戶名: ")
        passwd = input("請輸入密碼: ")
        user_info = connect_user_tb()
        for i in user_info:
            if username == i[1] and passwd == i[2]:
                return (i)
        else:
            count += 1
            print(‘您輸入的用戶名密碼不正確,請重新輸入‘)
            continue
    else:
        return False

def connect_host_user_tb(data):
    conn = pymysql.Connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, password=‘aixocm‘, database=‘oldboy‘,
                           charset=‘utf8‘)
    cursor = conn.cursor()
    cursor.execute(‘select host_tb.ip,host_tb.port,host_tb.username,host_tb.passwd from host_user_tb inner join host_tb on host_user_tb.hostId=host_tb.id  and host_user_tb.userId=%s‘,[data])
    host_info = cursor.fetchall()
    cursor.close()
    conn.close()
    return host_info



class Mythread(Thread):
    def __init__(self, host, port, username, passwd, lock, cmd):
        super().__init__()
        self.host = host
        self.port = port
        self.username = username
        self.passwd = passwd
        self.lock = lock
        self.cmd = cmd
    def run(self):
        with self.lock:
            try:
                ssh = paramiko.SSHClient()
                ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)  # 忽略密鑰認證,使用密碼認證
                ssh.connect(hostname=self.host, username=self.username, password=self.passwd)
                stdin, stdout, stderr = ssh.exec_command(self.cmd)
                print("#######################主機%s開始執行名########################" % (self.host))
                print(stdout.read().decode(‘utf-8‘))
                print(stderr.read().decode(‘utf-8‘))
                ssh.close()
                print("#######################主機執行結束########################")
            except Exception as e:
                print(e)
def main():
    """程序入口"""
    lock = RLock()
    auth_res = auth()
    if auth_res:
        host_info = connect_host_user_tb(auth_res[0])
        str = "用戶名: %s     郵  箱: %s     部  門: %s" %(auth_res[1],auth_res[3],auth_res[4])
        print(str)
        print(‘ip                 port      username        passwd‘)

        for host in host_info:
            print(host[0] + ‘       ‘,host[1], ‘       ‘ + host[2] + ‘           ‘ + host[3])
        t_list = []
        while True:
            try:
                select_ip = input("請輸入要執行命令的主機ip,多個主機以逗號分隔,未選擇表示執行所有主機:>>").strip()
                ip_list = select_ip.split(‘,‘)
                cmd = input("請輸入執行的命令>>: ").strip()
                if not select_ip:
                    for host in host_info:
                        t = Mythread(host[0],host[1],host[2],host[3],lock,cmd)
                        t.daemon=True
                        t.start()
                        t_list.append(t)
                    for t in t_list:
                        t.join()
                else:
                    for ip in ip_list:
                        for host in host_info:
                            if ip == host[0]:
                                t = Mythread(host[0], host[1], host[2], host[3], lock, cmd)
                                t.daemon = True
                                t.start()
                                t_list.append(t)
                            for t in t_list:
                                t.join()
                is_exit = input("是否退出,輸入yY/nN")
                if is_exit.upper() == ‘Y‘:
                    break
            except Exception as e:
                print(e)
                break
    else:
        print(‘登錄失敗,退出程序‘)

if __name__ == ‘__main__‘:
    main()


本文出自 “linux技術” 博客,請務必保留此出處http://haoyonghui.blog.51cto.com/4278020/1947584

python 使用paramiko, pymysql實現批量管理服務器