Python_基于Python同Linux进行交互式操作实现通过堡垒机访问目标机
基于Python同Linux进行交互式操作实现通过堡垒机访问目标机
by:授客 QQ:1033553122 欢迎加入全国软件测试交流群:7156436
实现功能
远程登录Linux堡垒机,同Linux进行交互式操作,访问目标机
测试环境
Win7 64位
Python 3.3.4
paramiko 1.15.2
下载地址:
https://pypi.python.org/pypi/paramiko/1.15.2
https://pan.baidu.com/s/1i4SJ1CL
cryptography-1.0-cp34-none-win_amd64.whl
(如果paramiko可以正常安装完,则不需要安装该类库)
下载地址:
https://pypi.python.org/pypi/cryptography/1.0
https://pan.baidu.com/s/1jIRBJvg
安装好后,找到nt.py(本例中路径为:
Lib\site-packages\pycrypto-2.6.1-py3.4-win-amd64.egg\Crypto\Random\OSRNG\nt.py),修改
import winrandom
为
from Crypto.Random.OSRNG import winrandom
如下
#import winrandom
from Crypto.Random.OSRNG import winrandom
以解决ImportError: No module named 'winrandom'错误
说明:具体文件路径可能还得根据实际报错情况来确定,如下
............(略)
"D:\Program Files\python33\lib\site-packages\Crypto\Random\OSRNG\nt.py", line 28, in
import winrandom
ImportError: No module named 'winrandom'
VS2010
因操作系统而异,可能需要安装VS2010,以解决包依赖问题
需求
SSH登录堡垒机后,根据提示输入相关信息,进入到目标机,如下
代码实践
#!/usr/bin/env/ python
#
-*- coding:utf-8 -*-
__author__
=
'shouke'
from
paramiko.client
import
AutoAddPolicy
from
paramiko.client
import
SSHClient
class
MySSHClient:
def
__init__(self):
self.ssh_client
= SSHClient()
#
连接登录
def
connect(self,
hostname, port, username, password,
host_via_by_bastion):
try:
self.ssh_client.set_missing_host_key_policy(AutoAddPolicy())
self.ssh_client.connect(hostname=hostname,
port=port,
username=username,
password=password,
timeout=30)
channel
=
self.ssh_client.invoke_shell()
channel.settimeout(10)
# 读、写操作超时时间,10秒
######################
定制化开发 ###########
print('正在通过堡垒机:%s
访问目标机:%s'
% (hostname, host_via_by_bastion))
host_via_by_bastion
= host_via_by_bastion +
'\n'
prompt_input_list
= [{'Please
enter your ID':'xxx255222\n'},
{'Please
enter your password':
'passwd123\n'},
{'Please
select your app ip':host_via_by_bastion},
{'select
your user for login':'1\n'}]
end_flag1
=
']$'
end_flag2
=
']#'
stdout
=
'' #
存放每次执行读取的内容
for
item
in
prompt_input_list:
prompt
=
list(item.keys())[0]
input
= item[prompt]
flag
=
False
while
stdout.find(prompt) == -1:
try:
stdout
+= channel.recv(65535).decode('utf-8')#.decode('utf-8')
flag
=
True
except
Exception
as
e:
print('通过堡垒机:%s
访问目标机:%s
失败:%s'
% (hostname, host_via_by_bastion, e))
flag
=
False
break
if
flag:
channel.send(input)
else:
# 未找到了对应提示
return
[False,
'通过堡垒机:%s
访问目标机:%s
失败,可能是读取命令返回结果超时,或者没找到对应输入提示' %
(hostname, host_via_by_bastion)]
flag
=
False
while
not
(stdout.rstrip().endswith(end_flag1)
or
stdout.rstrip().endswith(end_flag2)):
try:
stdout
= channel.recv(2048).decode('utf-8')
flag
=
True
except
Exception
as
e:
print('通过堡垒机:%s
访问目标机:%s
失败:%s'
% (hostname, host_via_by_bastion, e))
flag
=
False
break
if
flag:
return
[True,
'']
else:
# 未找到了对应提示
return
[False,
'没出现成功登录提示符 ]$
或 ]#
']
channel.close()
return
[True,
'']
except
Exception
as
e:
return
[False,
'%s'
% e]
#
远程执行命令
def
exec_command(self,
command, target_host, bastion_host):
try:
channel
=
self.ssh_client.invoke_shell()
channel.settimeout(30)
# 读、写操作超时时间,30秒
end_flag1
=
']$'
end_flag2
=
']#'
################
定制化开发 ##############################
if
bastion_host !=
'':
print('正在通过堡垒机:%s
访问目标机:%s'
% (bastion_host, target_host))
target_host_input
= target_host +
'\n'
prompt_input_list
= [{'Please
enter your ID':'01367599\n'},
{'Please
enter your password':
'Huozhe2020\n'},
{'Please
select your app ip':target_host_input},
{'select
your user for login':'1\n'}]
stdout
=
'' #
存放每次执行读取的内容
for
item
in
prompt_input_list:
prompt
=
list(item.keys())[0]
input
= item[prompt]
flag
=
False
while
stdout.find(prompt) == -1:
try:
stdout
+= channel.recv(65535).decode('utf-8')#.decode('utf-8')
flag
=
True
except
Exception
as
e:
print('通过堡垒机:%s
访问目标机:%s
失败:%s'
% (bastion_host, target_host,
e))
flag
=
False
break
if
flag:
channel.send(input)
else:
# 未找到了对应提示
print('通过堡垒机:%s
访问目标机:%s
失败,可能是读取命令返回结果超时,或者没找到对应输入提示' %
(bastion_host, target_host))
#
return [False, '通过堡垒机:%s 访问目标机:%s 失败,可能是读取命令返回结果超时,或者没找到对应输入提示'
% (bastion_host,
target_host)]
return
while
not
(stdout.rstrip().endswith(end_flag1)
or
stdout.rstrip().endswith(end_flag2)):
try:
stdout
= channel.recv(2048).decode('utf-8')
except
Exception
as
e:
print('通过堡垒机:%s
访问目标机:%s
失败:没出现成功登录提示符 ]$ 或 ]#'
% (bastion_host, target_host))
return
channel.send(command+'\n')
command_res
=
'' #
存放每次执行读取的内容
while
not
(command_res.endswith(end_flag1)
or
command_res.endswith(end_flag2)):
try:
command_res
= channel.recv(2048).decode('utf-8').strip()
except
Exception
as
e:
print('在目标机(IP:
%s)上进行读取操作超时'
% target_host)
break
channel.close()
except
Exception
as
e:
print('针对目标机:%s
执行命令: %s
出错 %s'
% (target_host, command, e))
Python_基于Python同Linux进行交互式操作实现通过堡垒机访问目标机的更多相关文章
- Python之路,Day12 - 那就做个堡垒机吧
Python之路,Day12 - 那就做个堡垒机吧 本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多 ...
- Python成长笔记 - 基础篇 (十三)--堡垒机
堡垒机架构 堡垒机的主要作用权限控制和用户行为审计,堡垒机就像一个城堡的大门,城堡里的所有建筑就是你不同的业务系统 , 每个想进入城堡的人都必须经过城堡大门并经过大门守卫的授权,每个进入城堡的人必须且 ...
- python之实现批量远程执行命令(堡垒机)
python远程批量执行 我并不是一个专业的开发,我一直在学习linux运维,对于python也是接触不久,所以代码写的并不是很规范简洁. 前段时间一个同学找我一起做一个自动化运维平台,我对pytho ...
- 基于python实现Oracle数据库连接查询操作
使用python语言连接Oracle数据库配置 #coding:utf-8 import cx_Oracle as oracle db=oracle.connect('root/123456@192. ...
- python第七十一天---堡垒机
堡垒机的表结构图:
- 性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据
基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据 by:授客 QQ:1033553122 实现功能 测试环境 环境搭建 使用前提 使用方法 运行程序 效果展 ...
- 性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机或Docker容器性能数据
基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据 by:授客 QQ:1033553122 实现功能 1 测试环境 1 环境搭建 3 使用前提 3 使用方法 ...
- 基于python的堡垒机
一 堡垒机的架构 堡垒机的核心架构通常如下图所示: 二.堡垒机的一般执行流程 管理员为用户在服务器上创建账号(将公钥放置服务器,或者使用用户名密码) 用户登陆堡垒机,输入堡垒机用户名密码,显示当前用户 ...
- Python之路——堡垒机原理及其简单实现
1 堡垒机基本概述 其从功能上讲,它综合了核心系统运维和安全审计管控两大主干功能,从技术实现上讲,通过切断终端计算机对网络和服务器资源的直接访问,而采用协议代理的方式,接管了终端计算机对网络和服务器的 ...
随机推荐
- 涨姿势:Spring Boot 2.x 启动全过程源码分析
目录 SpringApplication 实例 run 方法运行过程 总结 上篇<Spring Boot 2.x 启动全过程源码分析(一)入口类剖析>我们分析了 Spring Boot 入 ...
- axios的秘密
vue自2.0开始,vue-resource不再作为官方推荐的ajax方案,转而推荐使用axios. 按照作者的原话来说: “Ajax 本身跟 Vue 并没有什么需要特别整合的地方,使用 fetch ...
- Linux命令行文本工具
浏览文件 cat 查看文件内容 more 以翻页形式查看文件内容(只能向下翻页) less 以翻页形式查看文件内容(可以上下翻页) head 查看文件的头几行(默认10行) tail 查看文件的尾几行 ...
- Unity教程之-UGUI美术字体的制作与使用
文章转载自:http://www.unity.5helpyou.com/3211.html 游戏制作中,经常需要使用各种花哨的文字或者数字,而字体库往往不能达到我们需要的效果,因此需要一种用图片替代文 ...
- 【干货】利用MVC5+EF6搭建博客系统(四)(下)前后台布局实现、发布博客以及展示
二.博客系统后台布局实现 2.1.这里所用的是MVC的布局页来实现的,后台主要分为三部分:导航.菜单.主要内容 代码实现: 这里把后台单独放在一个区域里面,所以我这里建立一个admin的区域 在布局页 ...
- leetcode — merge-intervals
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util. ...
- #19 re&jieba模块
前言 在Python中,需要对字符串进行大量的操作,有时需要从一个字符串中提取到特定的信息,用切片肯定是不行的,所有这一节记录两个强大的文本处理模块,一个是正则表达式re模块,另一个是中文处理模块ji ...
- 解决QTableWidget不显示数据的问题
QTableWidget通常用于数据的展示,通过其表格布局可以让用户更清晰的查看数据,同时也让数据的筛选变得更加直观. 不过,初学者们和粗心大意的人总是会发现明明自己数据已经正常添加,可是程序运行之后 ...
- [转]NET Core静态文件的缓存方式
本文转自:https://www.cnblogs.com/Leo_wl/p/6059349.html 阅读目录 NET Core静态文件的缓存方式 一.前言 二.StaticFileMiddlewar ...
- 杭电ACM2001--计算两点间的距离
计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...