1、需求
命令行模式的堡壘機簡單需求:
- 管理員為用戶在服務器上創建賬號(將公鑰放置服務器,或者使用用戶名密碼)
- 用戶登陸堡壘機,輸入堡壘機用戶名密碼,顯示當前用戶管理的服務器列表
- 用戶選擇服務器,並自動登陸
- 執行操作並同時將用戶操作記錄
2、程序設計
程序一:
1、后台管理
- 堡壘機上創建用戶和密碼(堡壘機root封裝的類,UserProfile表)
- .bashrc
/usr/bin/python3 /data/bastion.py
exit
2、后台管理
- 服務器上創建用戶和密碼 或 公鑰上傳
- 服務器賬號 -> 人 關聯
程序二:
3、用戶登錄
說明:用戶使用xsehll登陸的時候,觸發登陸腳本例如:
- ssh 堡壘機用戶名@堡壘機IP
- 獲取當前用戶 os.environ['USER']
- 獲取當前用戶的主機列表
- 獲取選中的主機下的所有用戶
- 選擇任何一個用戶
3、實現思路
堡壘機執行流程:
- 管理員為用戶在服務器上創建賬號(將公鑰放置服務器,或者使用用戶名密碼)
- 用戶登陸堡壘機,輸入堡壘機用戶名密碼,現實當前用戶管理的服務器列表
- 用戶選擇服務器,並自動登陸
- 執行操作並同時將用戶操作記錄
注:配置.brashrc實現ssh登陸后自動執行腳本,如:/usr/bin/python /home/wupeiqi/menu.py
那么需要用到的點:
- 1、使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有組件對數據進行操作。根據類創建對象,對象轉換成SQL,執行SQL。
- 2、paramiko模塊,基於SSH用於連接遠程服務器並執行相關操作。
具體實現流程:
- 設計表機構
- 創建表結構
- 利用paramiko模塊去實現跳板機底層的ssh連接並執行相關操作
- 將底層的連接封裝成跳板機用戶對指定主機組和用戶的操作並記錄日志
4、表結構設計
1、主機表
記錄服務器主機名、IP、端口。
2、主機用戶表
記錄唯一ID號主機對於的用戶名、連接方式、連接憑證。這里需要用外鍵關聯一下主機表的ID。
3、跳板機用戶表
記錄跳板機的用戶名/密碼。
4、跳板機用戶和主機用戶關聯表
記錄跳板機用戶和服務主機用戶的對應關系。
5、日志記錄表
記錄跳板機用戶的命令操作日志。

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 from sqlalchemy import create_engine, and_, or_, func, Table 5 from sqlalchemy.ext.declarative import declarative_base 6 from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, DateTime 7 from sqlalchemy.orm import sessionmaker, relationship 8 9 Base = declarative_base() # 生成一個SqlORM 基類 10 11 12 class Host(Base): 13 __tablename__ = 'host' 14 id = Column(Integer, primary_key=True, autoincrement=True) 15 hostname = Column(String(64), unique=True, nullable=False) 16 ip_addr = Column(String(128), unique=True, nullable=False) 17 port = Column(Integer, default=22) 18 19 20 class HostUser(Base): 21 __tablename__ = 'host_user' 22 id = Column(Integer, primary_key=True, autoincrement=True) 23 username = Column(String(64), unique=True, nullable=False) 24 AuthTypes = [ 25 ('p', 'SSH/Password'), 26 ('r', 'SSH/KEY'), 27 ] 28 auth_type = Column(String(16)) 29 cert = Column(String(255)) 30 31 host_id = Column(Integer, ForeignKey('host.id')) 32 33 __table_args__ = ( 34 UniqueConstraint('host_id', 'username', name='_host_username_uc'), 35 ) 36 37 38 class Group(Base): 39 __tablename__ = 'group' 40 id = Column(Integer, primary_key=True, autoincrement=True) 41 name = Column(String(64), unique=True, nullable=False) 42 43 44 class UserProfile(Base): 45 __tablename__ = 'user_profile' 46 id = Column(Integer, primary_key=True, autoincrement=True) 47 username = Column(String(64), unique=True, nullable=False) 48 password = Column(String(255), nullable=False) 49 50 51 class Group2UserProfile(Base): 52 __tablename__ = 'group_2_user_profile' 53 id = Column(Integer, primary_key=True, autoincrement=True) 54 user_profile_id = Column(Integer, ForeignKey('user_profile.id')) 55 group_id = Column(Integer, ForeignKey('group.id')) 56 __table_args__ = ( 57 UniqueConstraint('user_profile_id', 'group_id', name='ux_user_group'), 58 ) 59 60 61 class Group2HostUser(Base): 62 __tablename__ = 'group_2_host_user' 63 id = Column(Integer, primary_key=True, autoincrement=True) 64 host_user_id = Column(Integer, ForeignKey('host_user.id')) 65 group_id = Column(Integer, ForeignKey('group.id')) 66 __table_args__ = ( 67 UniqueConstraint('group_id', 'host_user_id', name='ux_group_host_user'), 68 ) 69 70 71 class UserProfile2HostUser(Base): 72 __tablename__ = 'user_profile_2_host_user' 73 id = Column(Integer, primary_key=True, autoincrement=True) 74 host_user_id = Column(Integer, ForeignKey('host_user.id')) 75 user_profile_id = Column(Integer, ForeignKey('user_profile.id')) 76 __table_args__ = ( 77 UniqueConstraint('user_profile_id', 'host_user_id', name='ux_user_host_user'), 78 ) 79 80 81 class AuditLog(Base): 82 __tablename__ = 'audit_log' 83 id = Column(Integer, primary_key=True, autoincrement=True) 84 85 action_choices2 = [ 86 (u'cmd', u'CMD'), 87 (u'login', u'Login'), 88 (u'logout', u'Logout'), 89 ] 90 action_type = Column(String(16)) 91 cmd = Column(String(255)) 92 date = Column(DateTime) 93 user_profile_id = Column(Integer, ForeignKey('user_profile.id')) 94 host_user_id = Column(Integer, ForeignKey('host_user.id')) 95 96 表結構示例
5、利用paramiko模塊實現ssh連接
5.1、paramiko實現ssh連接基礎:
http://www.cnblogs.com/yangliheng/p/6344528.html
5.2、SshClient 封裝 Transport:
基於用戶名密碼連接:
1 import paramiko 2 3 transport = paramiko.Transport(('hostname', 22)) 4 transport.connect(username='wupeiqi', password='123') 5 6 ssh = paramiko.SSHClient() 7 ssh._transport = transport 8 9 stdin, stdout, stderr = ssh.exec_command('df') 10 print stdout.read() 11 12 transport.close()
基於公鑰密鑰連接:
1 import paramiko 2 3 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') 4 5 transport = paramiko.Transport(('hostname', 22)) 6 transport.connect(username='wupeiqi', pkey=private_key) 7 8 ssh = paramiko.SSHClient() 9 ssh._transport = transport 10 11 stdin, stdout, stderr = ssh.exec_command('df') 12 13 transport.close()

1 import paramiko 2 from io import StringIO 3 4 key_str = """-----BEGIN RSA PRIVATE KEY----- 5 MIIEpQIBAAKCAQEAq7gLsqYArAFco02/55IgNg0r7NXOtEM3qXpb/dabJ5Uyky/8 6 NEHhFiQ7deHIRIuTW5Zb0kD6h6EBbVlUMBmwJrC2oSzySLU1w+ZNfH0PE6W6fans 7 H80whhuc/YgP+fjiO+VR/gFcqib8Rll5UfYzf5H8uuOnDeIXGCVgyHQSmt8if1+e 8 7hn1MVO1Lrm9Fco8ABI7dyv8/ZEwoSfh2C9rGYgA58LT1FkBRkOePbHD43xNfAYC 9 tfLvz6LErMnwdOW4sNMEWWAWv1fsTB35PAm5CazfKzmam9n5IQXhmUNcNvmaZtvP 10 c4f4g59mdsaWNtNaY96UjOfx83Om86gmdkKcnwIDAQABAoIBAQCnDBGFJuv8aA7A 11 ZkBLe+GN815JtOyye7lIS1n2I7En3oImoUWNaJEYwwJ8+LmjxMwDCtAkR0XwbvY+ 12 c+nsKPEtkjb3sAu6I148RmwWsGncSRqUaJrljOypaW9dS+GO4Ujjz3/lw1lrxSUh 13 IqVc0E7kyRW8kP3QCaNBwArYteHreZFFp6XmtKMtXaEA3saJYILxaaXlYkoRi4k8 14 S2/K8aw3ZMR4tDCOfB4o47JaeiA/e185RK3A+mLn9xTDhTdZqTQpv17/YRPcgmwz 15 zu30fhVXQT/SuI0sO+bzCO4YGoEwoBX718AWhdLJFoFq1B7k2ZEzXTAtjEXQEWm6 16 01ndU/jhAasdfasdasdfasdfa3eraszxqwefasdfadasdffsFIfAsjQb4HdkmHuC 17 OeJrJOd+CYvdEeqJJNnF6AbHyYHIECkj0Qq1kEfLOEsqzd5nDbtkKBte6M1trbjl 18 HtJ2Yb8w6o/q/6Sbj7wf/cW3LIYEdeVCjScozVcQ9R83ea05J+QOAr4nAoGBAMaq 19 UzLJfLNWZ5Qosmir2oHStFlZpxspax/ln7DlWLW4wPB4YJalSVovF2Buo8hr8X65 20 lnPiE41M+G0Z7icEXiFyDBFDCtzx0x/RmaBokLathrFtI81UCx4gQPLaSVNMlvQA 21 539GsubSrO4LpHRNGg/weZ6EqQOXvHvkUkm2bDDJAoGATytFNxen6GtC0ZT3SRQM 22 WYfasdf3xbtuykmnluiofasd2sfmjnljkt7khghmghdasSDFGQfgaFoKfaawoYeH 23 C2XasVUsVviBn8kPSLSVBPX4JUfQmA6h8HsajeVahxN1U9e0nYJ0sYDQFUMTS2t8 24 RT57+WK/0ONwTWHdu+KnaJECgYEAid/ta8LQC3p82iNAZkpWlGDSD2yb/8rH8NQg 25 9tjEryFwrbMtfX9qn+8srx06B796U3OjifstjJQNmVI0qNlsJpQK8fPwVxRxbJS/ 26 pMbNICrf3sUa4sZgDOFfkeuSlgACh4cVIozDXlR59Z8Y3CoiW0uObEgvMDIfenAj 27 98pl3ZkCgYEAj/UCSni0dwX4pnKNPm6LUgiS7QvIgM3H9piyt8aipQuzBi5LUKWw 28 DlQC4Zb73nHgdREtQYYXTu7p27Bl0Gizz1sW2eSgxFU8eTh+ucfVwOXKAXKU5SeI 29 +MbuBfUYQ4if2N/BXn47+/ecf3A4KgB37Le5SbLDddwCNxGlBzbpBa0= 30 -----END RSA PRIVATE KEY-----""" 31 32 private_key = paramiko.RSAKey(file_obj=StringIO(key_str)) 33 transport = paramiko.Transport(('10.0.1.40', 22)) 34 transport.connect(username='wupeiqi', pkey=private_key) 35 36 ssh = paramiko.SSHClient() 37 ssh._transport = transport 38 39 stdin, stdout, stderr = ssh.exec_command('df') 40 result = stdout.read() 41 42 transport.close() 43 44 print(result)
5.3、Ssh連接demo:

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import paramiko 4 import uuid 5 6 class Haproxy(object): 7 8 def __init__(self): 9 self.host = '172.0.2.19' 10 self.port = 21345 11 self.username = 'ylh' 12 self.pwd = '123' 13 self.__k = None 14 15 def create_file(self): 16 file_name = str(uuid.uuid4()) 17 with open(file_name,'w') as f: 18 f.write('sb') 19 return file_name 20 21 def run(self): 22 self.connect() 23 self.upload() 24 self.rename() 25 self.close() 26 27 def connect(self): 28 transport = paramiko.Transport((self.host,self.port)) 29 transport.connect(username=self.username,password=self.pwd) 30 self.__transport = transport 31 32 def close(self): 33 34 self.__transport.close() 35 36 def upload(self): 37 # 連接,上傳 38 file_name = self.create_file() 39 40 sftp = paramiko.SFTPClient.from_transport(self.__transport) 41 # 將location.py 上傳至服務器 /tmp/test.py 42 sftp.put(file_name, '/home/wupeiqi/tttttttttttt.py') 43 44 def rename(self): 45 46 ssh = paramiko.SSHClient() 47 ssh._transport = self.__transport 48 # 執行命令 49 stdin, stdout, stderr = ssh.exec_command('mv /home/wupeiqi/tttttttttttt.py /home/wupeiqi/ooooooooo.py') 50 # 獲取命令結果 51 result = stdout.read() 52 53 54 ha = Haproxy() 55 ha.run()
6、Python操作Mysql數據庫
Python 操作 Mysql 模塊的安裝
Python 操作 Mysql 模塊的安裝
1
2
3
4
5
|
linux:
yum install MySQL
-
python
window:
http:
/
/
files.cnblogs.com
/
files
/
wupeiqi
/
py
-
mysql
-
win.
zip
|
SQL基本使用
http://www.cnblogs.com/yangliheng/p/6270392.html
Python Mysql Api
1、插入數據
2、刪除數據
3、修改數據
4、查數據
7、跳板機代碼目錄
Go_Jump/
|-- bin/
| |-- manager.py
| |-- manager.py
|-- foo/
| |-- tests/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
|
|-- docs/
| |-- conf.py
| |-- abc.rst
|
|-- setting.py
|-- requirements.txt
|-- README
8、跳板機簡單流程圖
9、完整代碼git地址
https://github.com/yangliheng