- 本书赞誉
- 前言
- 第一部分 基础篇
- 第1章 系统基础信息模块详解
- 第2章 业务服务监控详解
- 第3章 定制业务质量报表详解
- 第4章 Python 与系统安全
- 第二部分 高级篇
- 第5章 系统批量运维管理器 pexpect 详解
- 第6章 系统批量运维管理器 paramiko 详解
- 第7章 系统批量运维管理器Fabric详解
- 第8章 从零开发一个轻量级 WebServer
- 第9章 集中化管理平台 Ansible 详解
- 第10章 集中化管理平台 Saltstack 详解
- 第11章 统一网络控制器 Func 详解
- 第12章 Python 大数据应用详解
- 第三部分 案例篇
- 第13章 从零开始打造 B/S 自动化运维平台
- 第14章 打造 Linux 系统安全审计功能
- 第15章 构建分布式质量监控平台
- 第16章 构建桌面版 C/S 自动化运维平台
6.3 paramiko应用示例
6.3.1 实现密钥方式登录远程主机
实现自动密钥登录方式,第一步需要配置与目标设备的密钥认证支持,具体见9.2.5节,私钥文件可以存放在默认路径“~/.ssh/id_rsa”,当然也可以自定义,如本例的“/home/key/id_rsa”,通过paramiko.RSAKey.from_private_key_file方法引用,详细代码如下:
【/home/test/paramiko/simple2.py】
#!/usr/bin/env python import paramiko import os hostname='192.168.1.21' username='root' paramiko.util.log_to_file('syslogin.log') ssh=paramiko.SSHClient ssh.load_system_host_keys privatekey = os.path.expanduser('/home/key/id_rsa') #定义私钥存放路径 key = paramiko.RSAKey.from_private_key_file(privatekey) #创建私钥对象key ssh.connect(hostname=hostname,username=username,pkey = key) stdin,stdout,stderr=ssh.exec_command('free -m') print stdout.read ssh.close
程序执行结果见图6-1。
6.3.2 实现堡垒机模式下的远程命令执行
堡垒机环境在一定程度上提升了运营安全级别,但同时也提高了日常运营成本,作为管理的中转设备,任何针对业务服务器的管理请求都会经过此节点,比如SSH协议,首先运维人员在办公电脑通过SSH协议登录堡垒机,再通过堡垒机SSH跳转到所有的业务服务器进行维护操作,如图6-2所示。
图6-2 堡垒机模式下的远程命令执行
我们可以利用paramiko的invoke_shell机制来实现通过堡垒机实现服务器操作,原理是SSHClient.connect到堡垒机后开启一个新的SSH会话(session),通过新的会话运行“ssh user@IP”去实现远程执行命令的操作。实现代码如下:
【/home/test/paramiko/simple3.py】
#!/usr/bin/env python import paramiko import os,sys,time blip="192.168.1.23" #定义堡垒机信息 bluser="root" blpasswd="KJsdiug45" hostname="192.168.1.21" #定义业务服务器信息 username="root" password="IS8t5jgrie" 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) channel=ssh.invoke_shell #创建会话,开启命令调用 channel.settimeout(10) #会话命令执行超时时间,单位为秒 buff = '' resp = '' channel.send('ssh '+username+'@'+hostname+'\n') #执行ssh登录业务主机 while not buff.endswith(passinfo): #ssh登录的提示信息判断,输出串尾含有"\'s password:"时 try: #退出while循环 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') buff='' 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
运行结果如下:
# python /home/test/paramiko/simple3.py ifconfig eth0 Link encap:Ethernet HWaddr 00:50:56:28:63:2D inet addr:192.168.1.21 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::250:56ff:fe28:632d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3523007 errors:0 dropped:0 overruns:0 frame:0 TX packets:6777657 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:606078157 (578.0 MiB) TX bytes:1428493484 (1.3 GiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 … …
显示“inet addr:192.168.1.21”说明命令已经成功执行。
6.3.3 实现堡垒机模式下的远程文件上传
实现堡垒机模式下的文件上传,原理是通过paramiko的SFTPClient将文件从办公设备上传至堡垒机指定的临时目录,如/tmp,再通过SSHClient的invoke_shell方法开启ssh会话,执行scp命令,将/tmp下的指定文件复制到目标业务服务器上,如图6-3所示。
图6-3 堡垒机模式下的文件上传
本示例具体使用sftp.put方法上传文件至堡垒机临时目录,再通过send方法执行scp命令,将堡垒机临时目录下的文件复制到目标主机,详细的实现源码如下:
【/home/test/paramiko/simple4.py】
#!/usr/bin/env python import paramiko import os,sys,time blip="192.168.1.23" #定义堡垒机信息 bluser="root" blpasswd=" IS8t5jgrie" hostname="192.168.1.21" #定义业务服务器信息 username="root" password=" KJsdiug45" tmpdir="/tmp" remotedir="/data" localpath="/home/nginx_access.tar.gz" #本地源文件路径 tmppath=tmpdir+"/nginx_access.tar.gz" #堡垒机临时路径 remotepath=remotedir+"/nginx_access_hd.tar.gz" #业务主机目标路径 port=22 passinfo='\'s password: ' paramiko.util.log_to_file('syslogin.log') t = paramiko.Transport((blip, port)) t.connect(username=bluser, password=blpasswd) sftp =paramiko.SFTPClient.from_transport(t) sftp.put(localpath, tmppath) #上传本地源文件到堡垒机临时路径 sftp.close ssh=paramiko.SSHClient ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) ssh.connect(hostname=blip,username=bluser,password=blpasswd) channel=ssh.invoke_shell channel.settimeout(10) buff = '' resp = '' #scp中转目录文件到目标主机 channel.send('scp '+tmppath+' '+username+'@'+hostname+':'+remotepath+'\n') while not buff.endswith(passinfo): 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: channel.send('yes\n') buff='' channel.send(password+'\n') buff='' while not buff.endswith('# '): resp = channel.recv(9999) if not resp.find(passinfo)==-1: print 'Error info: Authentication failed.' channel.close ssh.close sys.exit buff += resp print buff channel.close ssh.close
运行结果如下,如目标主机/data/nginx_access_hd.tar.gz存在,则说明文件已成功上传。
# python /home/test/paramiko/simple4.py nginx_access.tar.gz 100% 1590KB 1.6MB/s 00:00
当然,整合以上两个示例,再引入主机清单及功能配置文件,可以实现更加灵活、强大的功能,大家可以自己动手,在实践中学习,打造适合自身业务环境的自动化运营平台。
参考提示 6.2节和6.3节常用类说明与应用案例参考http://docs.paramiko.org/en/1.13/官网文档。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论