那就用pthon來寫個跳板機吧


1、需求

命令行模式的堡壘機簡單需求:

  1. 管理員為用戶在服務器上創建賬號(將公鑰放置服務器,或者使用用戶名密碼)
  2. 用戶登陸堡壘機,輸入堡壘機用戶名密碼,顯示當前用戶管理的服務器列表
  3. 用戶選擇服務器,並自動登陸
  4. 執行操作並同時將用戶操作記錄

2、程序設計

程序一:
1、后台管理
- 堡壘機上創建用戶和密碼(堡壘機root封裝的類,UserProfile表)
- .bashrc
/usr/bin/python3 /data/bastion.py
exit

2、后台管理
- 服務器上創建用戶和密碼 或 公鑰上傳
- 服務器賬號 -> 人 關聯

程序二:
3、用戶登錄

說明:用戶使用xsehll登陸的時候,觸發登陸腳本例如:

- ssh 堡壘機用戶名@堡壘機IP
- 獲取當前用戶 os.environ['USER']
- 獲取當前用戶的主機列表
- 獲取選中的主機下的所有用戶
- 選擇任何一個用戶

3、實現思路

 

堡壘機執行流程:

  1. 管理員為用戶在服務器上創建賬號(將公鑰放置服務器,或者使用用戶名密碼)
  2. 用戶登陸堡壘機,輸入堡壘機用戶名密碼,現實當前用戶管理的服務器列表
  3. 用戶選擇服務器,並自動登陸
  4. 執行操作並同時將用戶操作記錄

注:配置.brashrc實現ssh登陸后自動執行腳本,如:/usr/bin/python /home/wupeiqi/menu.py

那么需要用到的點:

  1. 1、使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有組件對數據進行操作。根據類創建對象,對象轉換成SQL,執行SQL。
  2. 2、paramiko模塊,基於SSH用於連接遠程服務器並執行相關操作。

 

具體實現流程:

  1. 設計表機構
  2. 創建表結構
  3. 利用paramiko模塊去實現跳板機底層的ssh連接並執行相關操作
  4. 將底層的連接封裝成跳板機用戶對指定主機組和用戶的操作並記錄日志

 

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 表結構示例
表結構設計code

 

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()
demo

 

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

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM