Python 实现远程服务器批量执行命令
paramiko 远程控制介绍
Python paramiko是一个相当好用的远程登录模块,采用ssh协议,可以实现linux服务器的ssh远程登录。首先来看一个简单的例子
- import paramiko
- #实例化ssh客户端
- ssh = paramiko.SSHClient()
- #创建默认的白名单
- policy = paramiko.AutoAddPolicy()
- #设置白名单
- ssh.set_missing_host_key_policy(policy)
- #链接服务器
- ssh.connect(
- hostname = "192.168.2.186", #服务器的ip
- port = 22, #服务器的端口
- username = "root", #服务器的用户名
- password = "" #用户名对应的密码
- )
- #远程执行命令
- stdin,stdout,stderr = ssh.exec_command("ls")
- #exec_command 返回的对象都是类文件对象
- #stdin 标准输入 用于向远程服务器提交参数,通常用write方法提交
- #stdout 标准输出 服务器执行命令成功,返回的结果 通常用read方法查看
- #stderr 标准错误 服务器执行命令错误返回的错误值 通常也用read方法
- #查看结果,注意在Python3 字符串分为了:字符串和字节两种格式,文件返回的是字节
- result = stdout.read().decode()
- print(result)
这是一段最简单的paramiko的代码,其中比较难理解的就是白名单概念,所谓的白名单就是ssh的know_hosts文件,用来记录paramiko可以信任的远程主机,在
paramiko当中,需要生成和采用两个步骤,来避免在远程链接的时候,被询问是否信任远程登录的服务器。
threaing多线程介绍
想要学习多线程,先要明白:
进程:是程序的一次运行,我们运行一个程序,就会形成一个进程,进程有独立的内存空间,也被称为重量级进程。
线程:线程是进程下的一个分支,也被称为轻量级进程。
threading是python多线程的基础模块,也可以说Python程序员接触多线程最初接触的模块,
我们来看一下threading最基础的案例
为了好理解我们来了解前置代码的编写
最简单的例子:
- from time import sleep
- #通过这个例子我们来看计算机正常情况下的执行顺序 从左往右,从上到下
- def loop0():
- print("loop 0 is start")
- sleep(3)
- print("loop 0 is down")
- def loop1():
- print("loop 1 is start")
- sleep(2)
- print("loop 1 is down")
- def main():
- print("all is start")
- loop0()
- loop1()
- print("all is down")
- if __name__ == "__main__":
- main()
代码优化过的例子:
- from time import sleep
- def loop(num,sleeptime):
- """
- 当前函数作为功能函数
- :param num: 函数的编号
- :param sleeptime: 睡眠的时间
- """
- print("loop %s is start"%num)
- sleep(sleeptime)
- print("loop %s is done"%num)
- def main():
- sleep_list = [3,2] #睡眠时间
- lenth = len(sleep_list) #获取列表长度
- print("all is start")
- for i in range(lenth):
- loop(i,sleep_list[i]) #按照列表长度和列表内容调用函数
- print("all is down")
- if __name__ == "__main__":
- main()
多线程调用的例子:
- import threading
- from time import sleep
- def loop(num,sleeptime):
- """
- 当前函数作为功能函数
- :param num: 函数的编号
- :param sleeptime: 睡眠的时间
- """
- print("loop %s is start"%num)
- sleep(sleeptime)
- print("loop %s is done"%num)
- def main():
- sleep_list = [3,2] #睡眠时间
- lenth = len(sleep_list) #获取列表长度
- thread_list = []
- print("all is start")
- for i in range(lenth):
- #threading.Thread 就是用线程来执行我们的功能
- t = threading.Thread(target = loop,args = (i,sleep_list[i])) #按照列表长度和列表内容调用函数
- thread_list.append(t) #将生成的线程添加到列表里
- for t in thread_list:
- t.start() #开始执行线程
- for t in thread_list:
- t.join() #挂起线程,到所有线程结束
- print("all is down")
通过上面例子的执行,我们需要掌握以几个点:
1、threading.Thread方法用来创建线程,线程被创建的时候没有执行,需要通过start方法执行
2、多线程调用实际上就是把原有的功能发到线程上面去跑,所以我们使用多线程,功能要写成函数
3、Python的多线程是异步并发,而不是大家理解的并行,在这里
并发:指的是同时出发,不同时执行
并行:指的是同时进行,不一定同时出发
希望各位同学注意上面的三点,而值得大家思考的就是上面代码最后的for循环可以简化吗?为啥?
paramiko+threading 实现远程服务器批量执行命令
完成上面的代码实例,我们进行代码的整合,完成远程服务器批量执行命令的效果
- #coding:utf-8
- import sys
- import paramiko
- import threading
- def getConnection(ip,username,password,command,port = 22):
- """
- :param ip: 服务器的ip
- :param username: 服务器的用户名称
- :param password: 服务器的密码
- :param CMD: 服务器的命令
- :param port: 服务器的端口
- """
- ssh = paramiko.SSHClient()
- policy = paramiko.AutoAddPolicy()
- ssh.set_missing_host_key_policy(policy)
- ssh.connect(
- hostname = ip, # 服务器的ip
- port = port, # 服务器的端口
- username = username, # 服务器的用户名
- password = password # 用户名对应的密码
- )
- stdin, stdout, stderr = ssh.exec_command(command)
- result = stdout.read().decode()
- error = stderr.read().decode()
- print("+++++++++++++++++++++++start++++++++++++++++++++")
- print("[connect success] | ip : %s" % ip)
- print("result: \n %s"%result)
- if error != " ":
- print("error: \n %s"%error)
- print("+++++++++++++++++++++++done++++++++++++++++++++")
- ssh.close()
- #我们采用多线程
- def main(host_list,command):
- thread_list = []
- for ip,username,password in host_list:
- thread = threading.Thread(target = getConnection, args = (ip,username,password,command))
- thread_list.append(thread)
- for t in thread_list:
- t.start()
- for t in thread_list:
- t.join()
- if __name__ == "__main__":
- host_list = [
- ("192.168.2.186", "root", ""),
- ("192.168.2.88", "root", ""),
- ]
- command = sys.argv[1]
- main(host_list,command)
在这当中,我们使用了sys.argv方法来接收脚本外面执行的参数,当然,我们也可以将host_list写到一个配置文件当中使用。执行效果如下:
Python 实现远程服务器批量执行命令的更多相关文章
- linux下远程服务器批量执行命令及SFTP上传文件 -- python实现
之前写过一个python远程执行命令的脚本,但在一个性能测试中,要将程序批量分发到不同服务器,程序无法使用,再将之前的脚本更新,加入批量上传的功能.之前脚本地址:http://www.cnblogs. ...
- java连接远程服务器并执行命令
导入必要的jar包 <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganym ...
- Python操作远程服务器paramiko模块介绍
paramiko模块是基于Python实现的SSH远程安全连接,可以提供在远程服务器上执行命令.上传文件到服务器或者从指定服务器下载文件的功能. paramiko模块安装方法 paramiko模块不是 ...
- 【Shell实战】批量在多台服务器上执行命令
功能说明:批量在多台服务器上执行命令 #!/bin/bash # ========================================== # 功能:批量在多台服务器上执行命令 # 方法: ...
- java ssh远程服务器并执行多条shell命令
java ssh远程服务器并执行多条命令 import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...
- websocket+Django+python+paramiko实现web页面执行命令并实时输出
一.概述 WebSocket WebSocket的工作流程:浏览器通过JavaScript向服务端发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过 T ...
- shell脚本批量执行命令----必需判断上一步执行结果--没有捷径
# 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...
- Polysh实现多服务器批量执行shell
安装 wget wget http://guichaz.free.fr/polysh/files/polysh-0.4.tar.gz tar -zxvf polysh-0.4.tar.gz cd po ...
- linux集群批量执行命令
因为工作需要,需要修改集群中机器的配置,一台一台的修改太浪费时间,就想能不能通过自动化脚本批量执行命令,尝试写一个,自己shell不熟悉,写的有点渣渣 if [ "$#" -ne ...
随机推荐
- YUM方式安装LAMP
本文介绍两种方法yum安装LAMP, 方法1: 通过httpd的php模块方式安装LAMP 方法2: 通过php-fpm方式安装LAMP 安装环境:CentOS Linux release 7.5.1 ...
- java 操作 csv文件
CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件中,数据“栏”以逗号分隔,可允许程序通 ...
- 「USACO5.5」矩形周长Picture
题目描述 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 编写一个程序计算周长. 如图1所示7个矩形. 如图2所 ...
- ISBN号码(0)<P2008_1>
ISBN号码 (isbn.pas/c/cpp) [问题描述] 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxx ...
- git pull 之后怎么找回别覆盖掉的内容
[半夜吓出冷汗,git这个原理还真得好好学学] 不小心把本地写的东西pull了下,然后,全部覆盖掉了,以为就这样没了. 后面想到有“时光穿梭机”,“历史回滚”,在各大群友的帮助下,终于找回了. git ...
- VS2019 发布单文件
在项目.csproj文件下添加 <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework&g ...
- MAC97A6检测
- 【PAT甲级】1032 Sharing (25 分)
题意: 输入两个单词的起始地址和一个正整数N(<=1e5),然后输入N行数据,每行包括一个五位数的字母地址,字母和下一个字母的地址.输出这两个单词的公共后缀首字母的地址,若无公共后缀则输出-1. ...
- Celeste 机制研究
0. 简介.惯例.总论 Celeste (塞莱斯特) 是一个具有优秀手感的平台跳跃游戏. 虽然操作所使用的按键很少, 但是却有着复杂的组合机制. 在游戏实现上, Celeste 是一个锁定 60 帧 ...
- redis5.0版本集群搭建
模式简介 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令,比如:mget, 因 ...