# -*- coding:utf-8 -*-
# @Time : 2017-03-30 15:26
# @Author : Vincen
# @Site :
# @File : fortress.py
# @Software : PyCharm
import paramiko
import pymysql
from concurrent.futures import ThreadPoolExecutor
# database: paradb
# tables: user_type.dbf users.dbf hosts.dbf user_to_host.dbf
# user: alex 123456
class HostManage(object):
def __init__(self):
self.__conn = None
self.__cursor = None
self.__transport = None
self.host = "127.0.0.1"
self.port = 3306
self.user = "root"
self.passwd = "root"
self.db = "paradb"
self.command = None
self.db_cursor = self.db_connect()
def db_connect(self):
conn = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.passwd, db=self.db)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
self.__conn = conn
self.__cursor = cursor
return cursor
def auth(self, user_name, pass_word):
self.db_cursor.execute("select * from users where username=%s and password=%s", (user_name, pass_word))
if self.db_cursor.fetchall():
return True
def host_list(self, user_name):
self.db_cursor.execute("select h.ip,h.port,h.username,h.password from users u "
"left join user_to_host uh on u.id=uh.uid "
"left join hosts h on h.id=uh.hid "
"where u.username=%s", (user_name,))
return self.db_cursor.fetchall()
def ssh_connect(self, hosts):
ssh_client = paramiko.SSHClient()
host = hosts["ip"]
port = hosts["port"]
user_name = hosts["username"]
pass_word = hosts["password"]
transport = paramiko.Transport((host, port))
transport.connect(username=user_name, password=pass_word)
ssh_client._transport = transport
std_in, stdout, stderr = ssh_client.exec_command(self.command)
if stdout:
print(host.center(40, "-"))
print(str(stdout.read(), encoding="utf-8"))
else:
print(str(stderr.read(), encoding="utf-8"))
transport.close()
def ssh(self, hosts, command):
self.command = command
t = ThreadPoolExecutor(max_workers=2)
t.map(self.ssh_connect, hosts)
def close(self):
self.__conn.close()
self.__cursor.close()
self.__transport.close()
def __del__(self):
self.__conn.close()
self.__cursor.close()
if __name__ == '__main__':
host_manage = HostManage()
while True:
username = input("please input username >>>")
password = input("please input password >>>")
if host_manage.auth(username, password):
print("Welcome to ForTress System!")
break
else:
print("Authentication failed!")
host_list = host_manage.host_list(username)
for n, k in enumerate(host_list):
print("host".center(40, "-"))
print(n, ":", k["ip"])
while True:
numbers = input("please input host number >>>").strip()
if numbers == "q":
exit()
hosts = []
for num in numbers.split(" "): # split host list use blankspace
hosts.append(host_list[int(num)])
command = input("please input shell command >>>")
host_manage.ssh(hosts, command)