热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:python之实现批量远程执行命令(堡垒机)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了python之实现批量远程执行命令(堡垒机)相关的知识,希望对你有一定的参考价值。python

篇首语:本文由编程笔记#小编为大家整理,主要介绍了python之实现批量远程执行命令(堡垒机)相关的知识,希望对你有一定的参考价值。



python远程批量执行

    我并不是一个专业的开发,我一直在学习linux运维,对于python也是接触不久,所以代码写的并不是很规范简洁。

    前段时间一个同学找我一起做一个自动化运维平台,我对python的django还没有了解,并且对于HTML和JS这类开发学习还没有涉及,所以我说我做些后台的实现,前端就交给我的同学做。不扯淡了,下面说下我做批量执行的思路。



  1. 用到的模块:paramiko

  2. 功能:很简单就是批量执行命令,类似于ansible,本来想用Fabric,但是想一想还是用paramiko,因为我在学习ansible,ansible里面就有paramiko。后期还要将配置文件里面的主机组放到数据库里面。这里我想使用的mongodb,因为我的主机配置文件写的是字典的形式,保存在文档数据库中更为方便些。

  3. 配置文件格式:这里为了方便获取信息,直接写成了字典的形式,本来前期想用pickle模块进行序列化输入到文件中,但是后来发现如果主机要是多的话,手动输入还是太麻烦了。

  4. 类:为了后期更好的添加功能,我直接将paramiko的SSHClient写成了类。后面要添加上传文本,下载等功能,这就用到了SFTP的功能。

  5. 函数:这里面的函数就是对文件进行条件输出,找到符合的主机组名称。

  6. 讲解下paramiko:paramiko模块在我理解就是依赖ssh远程的一个模块。

    (1)、paramiko安装方式:使用pip安装即可。

    (2)、paramiko核心组件-----SSHClient

           SSHClient使用ssh的通道实现和主机的连接和命令执行。

           

























SSHClient中的方法参数和参数说明
connect(实现ssh连接和校验)

hostname:目标主机地址

port:主机端口

username:校验的用户名

password:登录密码

pkey:私钥方式身份验证

key_filename:用于私钥身份验证的文件名

timeout:连接超时设置

allow_agent:这是布尔型,设置False的时候禁止使用ssh代理

look_for_keys:也是布尔型,禁止在.ssh下面找私钥文件

compress:设置压缩


exec_command(远程执行命令)

stdin,stdout,stderr:这三个分别是标准输入、输出、错误,用来获取命令执行结果,并不算方法的参数

command:执行命令的字符串,带双引号。

bufsize:文件缓冲大小,默认为1

 


load_system_host_keys(加载本地的公钥文件)filename:指定远程主机的公钥记录文件
set_missing_host_key_policy(远程主机没有密钥)

AutoAddPolicy:自动添加主机名和主机密钥到本地的HostKeys对象

RejectPolicy:自动拒绝未知的主机名和密钥(默认)

WarningPolicy:接受未知主机,但是会有警告


             (3)paramiko的核心组件SFTPClient类

                     实现远程文件的操作,比如上传、下载、权限、状态等。

























SFTPClient类的方法参数和参数说明
from_transport(使用一个已经通过已经连通的SFTP客户端通道)t:使用的是已经验证过的传输对象
 put(上传本地文件到SFTP服务器)

localpath:本地文件的路径

remotepath:远程路径

callback:获取已接收的字节数和总传输的字节数

confirm:文件上传完毕后是否调用stat()方法,确定文件大小


 get(从SFTP服务器上下载文件到本地)

 remotepath:需下载的文件路径

localpath:保存本地的文件路径

callback:和put的一样。


 mkdir:简历目录

remove:删除

rename:重命名

stat:获取远程文件信息

listdir:获取指定目录列表


 

    (4)、还有个invoke_shell的用法经常使用

invoke_shell(*args, **kwds)
Request an interactive shell session on this channel. If the server allows it, the channel will then be directly connected to the stdin, stdout,
and stderr of the shell.
Normally you would call get_pty before this,
in which case the shell will operate through the pty, and the channel will be connected to the stdin and stdout of the pty.
When the shell exits, the channel will be closed
and can’t be reused. You must open a new channel if you wish to open another shell.
在这个通道请求一个交互式的shell会话,如果服务允许,这个通道将会直接连接标准输入、标准输入和错误的shell,通常我们会在使用它之前调用get_pty的用法,这样shell会话是通过伪终端处理的,并且会话连接标准输入和输出,当我们shell退出的时候,这个通道也会关闭,并且能再次使用,你必修重新开另一个shell。

 


    (4)实践堡垒机(摘自刘天斯老师的《python自动化运维》)

技术分享技术分享

#定义服务器信息
hostname = "192.168.0.158"
username
= "root"
password
= "aixocm"
#定义登录日志和密码提示符
port = 22
passinfo
= \\‘s password:
paramiko.util.log_to_file(
syslogin.log)
#登录堡垒机,自动添加hostkeys信息到主机
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(
100)
#通道执行shell的ssh连接
buff = ‘‘
resp
= ‘‘
channel.send(
ssh +username+@+hostname+\\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()


View Code

 



  1. 配置文件:代码:

 


{"hostname":"web","host_ip":["192.168.0.157","192.168.0.158","192.168.0.159"]}

 

类:#!/usr/bin/env pyth#coding:utf-8import paramiko


class action(object):
def __init__(self, IP, username, command):
self.IP = IP
self.username = username
self.command = command
def ssh_connect(self):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname
=self.IP, username=self.username)
stdin,stdout,stderr=ssh.exec_command(self.command)
print "######################> %s <####################" %(self.IP)
print stderr.read()
print stdout.read()
ssh.close()

except Exception,e:
print "######################> %s <####################" %(self.IP)
print

执行主函数:


from simple1 import action
def
get_values(hostname):
conf_file
=open(scn.conf,r)
lines
= conf_file.readlines()
for line in lines:
line
= line.strip("\\n")
line
= eval(line)
if hostname == line["hostname"]:
return(line)
break
conf_file.close()
if __name__ == "__main__":

hostname
= raw_input("write your hostname:")
username
= raw_input("write your username:")
command
= raw_input("write your excute command:")
host
= get_values(hostname)
host_ip = list(host["host_ip"])

for i in range(0,len(host_ip)):
conn
= action(host_ip[i],username,command)
conn.ssh_connect()

注意这里面我没有添加password和port,port默认使用的ssh的22号端口,password我直接使用ssh-keygen和ssh-copy-id进行无密码登录。

 

 







推荐阅读
  • 【教程】SecureCRT8.5安装和注册的详细步骤及操作指南
    00.目录文章目录00.目录01.SecureCRT8.5介绍02.SecureCRT8.5的特性03.SecureCRT8.5的特点04.SecureCRT8.5安装05.Sec ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 计算机原理概念:1、CPU和内存中的存储单元通信线路称为总线(BUS),总线是被指令和数据复用的,所以也称为前端总线。2、计算机中计算频率的时间标准即晶体振荡器原理,精确计算时间长 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 原理:dismiss再弹出,把dialog设为全局对象。if(dialog!null&&dialog.isShowing()&&!(Activity.)isFinishing()) ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • 1、打开etcsysconfiggrub,   #vimetcsysconfiggrub   内容如下: ... [详细]
  • 用LGWR WORKER的例子介绍strace分析Oracle数据库行为的方法
    可观测性能力是IT运维的强有力的支撑。日志告警、指标是两种在运维中很常用的可观测性指标。 ... [详细]
  • OpenStackQ版本已经发布了一段时间了。今天,小编来总结一下OpenStackQ版本核心组件的各项主要新功能,再来汇总一下最近2年来OpenStackN、O、P、Q各版本核心 ... [详细]
author-avatar
beauty360尜囡囡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有