Python实现堡垒机模式下远程命令执行操作示例


Posted in Python onMay 09, 2019

本文实例讲述了Python实现堡垒机模式下远程命令执行操作。分享给大家供大家参考,具体如下:

一 点睛

堡垒机环境在一定程度上提升了运营安全级别,但同时也提高了日常运营成本,作为管理的中转设备,任何针对业务服务器的管理请求都会经过此节点,比如SSH协议,首先运维人员在办公电脑通过SSH协议登录堡垒机,再通过堡垒机SSH跳转到所有的业务服务器进行维护操作。

Python实现堡垒机模式下远程命令执行操作示例

我们可以利用paramiko的invoke_shell机制来实现通过堡垒机实现服务器操作,原理是SSHClient.connect到堡垒机后开启一个新的SSH会话 (session),通过新的会话运行“ssh user@IP”去实现远程执行命令的操作。

二 代码

#coding=utf-8
#!/usr/bin/env python
import paramiko
import os,sys,time
hostname="192.168.0.120"      # 定义业务服务器
username="root"
password="123456"
blip="192.168.0.101"        # 定义业务堡垒机
bluser="root"
blpasswd="123456"
port=22
passinfo='\'s password: '      # 输入服务器密码的前标志串
paramiko.util.log_to_file('syslogin.log')
ssh=paramiko.SSHClient()      # ssh登录堡垒机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=blip,username=bluser,password=blpasswd)
#new session
channel=ssh.invoke_shell()     # 创建会话,开启命令调用
channel.settimeout(10)       # 会话命令执行超时时间,单位为秒
buff = ''
resp = ''
channel.send('ssh '+username+'@'+hostname+'\n')    # 执行ssh登录业务主机
while not buff.endswith(passinfo):           # ssh登录的提示信息判断,输出串尾含有"\'s password:"时退出while循环
  try:
    resp = channel.recv(9999)
  except Exception,e:
    print 'Error info:%s connection time.' % (str(e))
    channel.close()
    ssh.close()
    sys.exit()
  buff += resp
  if not buff.find('yes/no')==-1:          # 输出串尾含有"yes/no"时发送"yes"并回车
    channel.send('yes\n')
print(buff)
print("*************************************************************************************")
channel.send(password+'\n')              # 发送业务主机密码
buff=''
while not buff.endswith('# '):             # 输出串尾为"# "时说明校验通过并退出while循环
  resp = channel.recv(9999)
  if not resp.find(passinfo)==-1:          # 输出串尾含有"\'s password: "时说明 密码不正确,要求重新输入
    print 'Error info: Authentication failed.'
    channel.close()                # 关闭连接对象后退出
    ssh.close()
    sys.exit()
  buff += resp
channel.send('ifconfig\n')               # 认证通过后发送ifconfig命令来查看结果
buff=''
try:
  while buff.find('# ')==-1:
    resp = channel.recv(9999)
    buff += resp
except Exception, e:
  print "error info:"+str(e)
print buff                       # 打印输出串
channel.close()
ssh.close()

三 输出结果

E:\Python\python_auto_maintain\venv\Scripts\python.exe E:/Python/python_auto_maintain/6_3_2.py
Last login: Thu Feb 28 22:00:07 2019 from 192.168.0.106
hello cakin24!
ssh root@192.168.0.120
[root@slave2 ~]# ssh root@192.168.0.120
root@192.168.0.120's password:
*************************************************************************************
ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.120  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::a00:27ff:fe0a:6e8a  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:0a:6e:8a  txqueuelen 1000  (Ethernet)
        RX packets 2046  bytes 179711 (175.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1408  bytes 148744 (145.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 404117  bytes 68752333 (65.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 404117  bytes 68752333 (65.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
qbr07d54630-64: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        ether 42:76:47:57:b2:75  txqueuelen 1000  (Ethernet)
        RX packets 11  bytes 572 (572.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
qvb07d54630-64: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1450
        inet6 fe80::4076:47ff:fe57:b275  prefixlen 64  scopeid 0x20<link>
        ether 42:76:47:57:b2:75  txqueuelen 1000  (Ethernet)
        RX packets 12  bytes 816 (816.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 648 (648.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
qvo07d54630-64: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1450
        inet6 fe80::dcbe:efff:feb7:5d52  prefixlen 64  scopeid 0x20<link>
        ether de:be:ef:b7:5d:52  txqueuelen 1000  (Ethernet)
        RX packets 8  bytes 648 (648.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12  bytes 816 (816.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@localhost ~]#

更多关于Python相关内容可查看本站专题:《Python字符串操作技巧汇总》、《Python常用遍历技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python AES加密实例解析
Jan 18 Python
Python迭代器定义与简单用法分析
Apr 30 Python
Python实现判断一行代码是否为注释的方法
May 23 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
Python3匿名函数用法示例
Jul 25 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
Pycharm如何运行.py文件的方法步骤
Mar 03 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
Django的ListView超详细用法(含分页paginate)
May 21 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 Python
Pandas加速代码之避免使用for循环
May 30 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 #Python
使用GitHub和Python实现持续部署的方法
May 09 #Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 #Python
Python Excel处理库openpyxl使用详解
May 09 #Python
python3实现小球转动抽奖小游戏
Apr 15 #Python
Django保护敏感信息的方法示例
May 09 #Python
Python基于scipy实现信号滤波功能
May 08 #Python
You might like
B2K与车机的中波PK
2021/03/02 无线电
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
python 识别图片中的文字信息方法
2018/05/10 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
奥巴马获胜演讲稿
2014/05/15 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
学校国庆节活动总结
2015/03/23 职场文书
2015年度企业工作总结
2015/05/21 职场文书
六五普法学习心得体会
2016/01/21 职场文书
python 进阶学习之python装饰器小结
2021/09/04 Python