作业需求:

1. 所有的用户操作日志要保留在数据库中

2. 每个用户登录堡垒机后,只需要选择具体要访问的设置,就连接上了,不需要再输入目标机器的访问密码

3. 允许用户对不同的目标设备有不同的访问权限,例:

对10.0.2.34 有mysql 用户的权限

对192.168.3.22 有root用户的权限

对172.33.24.55 没任何权限

4. 分组管理,即可以对设置进行分组,允许用户访问某组机器,但对组里的不同机器依然有不同的访问权限

思路解析:

1. 用户操作日志要保留在数据库中,通过课堂学习对paramiko源码进行修改,在demons/interactive.py 63行中获取用户操作,并将操作记录到数据库中。

2. 后面的需求使用数据库,建立多对多关联,反向取主机IP,主机密码,对应的堡垒机用户,并划分组内用户权限 ,具体使用sqlalchemy模块对数据库表进行操作。

3. 针对作业需求,程序添加了查看日志功能,并准许默认用户root查看所有用户操作,其他用户只能查自己下面机器的日志。

4. 添加了缓存redis减少了数据库IO操作。

paramiko 用户操作记录源码:

cmd =[]whileTrue:

r, w, e= select.select([chan, sys.stdin], [], []) # 默认阻塞if chan inr: # 连接建立好了,channle过来有数据了,try:

x= u(chan.recv(1024)) # 尝试收数据if len(x) == 0: # 收数据收不到,

sys.stdout.write('\r\n*** EOF\r\n')breaksys.stdout.write(x) # 标准输出

sys.stdout.flush() # flush 怕输出不到,远程发来的数据,远程机器返回

except socket.timeout:

passif sys.stdin inr: # 标准输入 活动就能返回到r

x= sys.stdin.read(1)if len(x) == 0:break

if x == "\r":

cmd_str= "".join(cmd)

print("---->",cmd_str)

cmd=[]else:

cmd.append(x)

chan.send(x)

表结构设计图:

python 机械控制 python 机械设计_配置文件

README:

开发环境: python3.6参考博客:

程序介绍1. 所有的用户操作日志要保留在数据库中2. 每个用户登录堡垒机后,只需要选择具体要访问的设置,就连接上了,不需要再输入目标机器的访问密码3. 允许用户对不同的目标设备有不同的访问权限,例:

对10.0.2.34有mysql 用户的权限

对192.168.3.22有root用户的权限

对172.33.24.55没任何权限4. 分组管理,即可以对设置进行分组,允许用户访问某组机器,但对组里的不同机器依然有不同的访问权限

文件目录结构

├── bin

│ ├── __init__.py

│ └── tiny.py # 主程序

├── conf

│ ├── action_registers.py # 程序命令交互

│ ├── __init__.py

│ ├── __pycache__

│ │ ├── action_registers.cpython-36.pyc

│ │ ├── __init__.cpython-36.pyc

│ │ └── settings.cpython-36.pyc

│ └── settings.py # 配置文件

├── log

│ └── __init__.py

├── models

│ ├── __init__.py

│ ├── models_backup.py # 备份测试

│ ├── models.py # 数据库表模块

│ ├── __pycache__

│ │ ├── __init__.cpython-36.pyc

│ │ └── models.cpython-36.pyc

│ └── test.py # redis测试

├── modules

│ ├── actions.py # 欢迎页和程序命令交互

│ ├── common_filters.py # 堡垒机用户主机绑定交互

│ ├── db_conn.py # mysql连接交互

│ ├── __init__.py

│ ├── interactive.py # ssh传输命令和命令写入交互

│ ├── __pycache__

│ │ ├── actions.cpython-36.pyc

│ │ ├── common_filters.cpython-36.pyc

│ │ ├── db_conn.cpython-36.pyc

│ │ ├── __init__.cpython-36.pyc

│ │ ├── interactive.cpython-36.pyc

│ │ ├── ssh_login.cpython-36.pyc

│ │ ├── utils.cpython-36.pyc

│ │ └── views.cpython-36.pyc

│ ├── ssh_login.py # ssh连接交互

│ ├── utils.py # yaml配置交互

│ └── views.py # 创建表,表数据创建,查看数据库数据交互

├── Server.zip

└── share

└── examples

├── new_bindhosts.yml # 主机绑定关系配置文件

├── new_groups.yml # 组创建,组关系绑定配置文件

├── new_hosts.yml # 主机配置文件

├── new_remoteusers.yml # 主机用户名密码配置文件

└── new_user.yml # 堡垒机用户配置文件

创建表和使用方法:

先要创建数据库:

create database tinytest charset utf8;1. python3 bin/tiny.py syncdb2. python3 bin/tiny.py create_hosts -f share/examples/new_hosts.yml3. python3 bin/tiny.py create_remoteusers -f share/examples/new_remoteusers.yml4. python3 bin/tiny.py create_users -f share/examples/new_user.yml5. python3 bin/tiny.py create_groups -f share/examples/new_groups.yml6. python3 bin/tiny.py create_bindhosts -f share/examples/new_bindhosts.yml7. python3 bin/tiny.py start_session

程序核心代码:

程序测试样图:

1. 创建表和插入表数据

python 机械控制 python 机械设计_python_02

2. 查看绑定关系

python 机械控制 python 机械设计_python 机械控制_03

python 机械控制 python 机械设计_用python做机械结构_04

3. 登陆和写入命令

python 机械控制 python 机械设计_用python做机械结构_05

4. 不同用户权限,组权限,登陆权限和查看日志权限

python 机械控制 python 机械设计_python_06

python 机械控制 python 机械设计_配置文件_07

python 机械控制 python 机械设计_python 机械控制_08

python 机械控制 python 机械设计_数据库_09

遇到的报错1:

redis.exceptions.DataError: Invalid input of type: 'dict'. Convert to a byte, stringor number first.

对redis降版:

pip3 install-U redis==2.10.6 #将当前版本降级到2.10.6