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 实现远程服务器批量执行命令的更多相关文章

  1. linux下远程服务器批量执行命令及SFTP上传文件 -- python实现

    之前写过一个python远程执行命令的脚本,但在一个性能测试中,要将程序批量分发到不同服务器,程序无法使用,再将之前的脚本更新,加入批量上传的功能.之前脚本地址:http://www.cnblogs. ...

  2. java连接远程服务器并执行命令

    导入必要的jar包 <dependency>  <groupId>ch.ethz.ganymed</groupId> <artifactId>ganym ...

  3. Python操作远程服务器paramiko模块介绍

    paramiko模块是基于Python实现的SSH远程安全连接,可以提供在远程服务器上执行命令.上传文件到服务器或者从指定服务器下载文件的功能. paramiko模块安装方法 paramiko模块不是 ...

  4. 【Shell实战】批量在多台服务器上执行命令

    功能说明:批量在多台服务器上执行命令 #!/bin/bash # ========================================== # 功能:批量在多台服务器上执行命令 # 方法: ...

  5. java ssh远程服务器并执行多条shell命令

    java ssh远程服务器并执行多条命令 import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...

  6. websocket+Django+python+paramiko实现web页面执行命令并实时输出

    一.概述 WebSocket WebSocket的工作流程:浏览器通过JavaScript向服务端发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过 T ...

  7. shell脚本批量执行命令----必需判断上一步执行结果--没有捷径

    # 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...

  8. Polysh实现多服务器批量执行shell

    安装 wget wget http://guichaz.free.fr/polysh/files/polysh-0.4.tar.gz tar -zxvf polysh-0.4.tar.gz cd po ...

  9. linux集群批量执行命令

    因为工作需要,需要修改集群中机器的配置,一台一台的修改太浪费时间,就想能不能通过自动化脚本批量执行命令,尝试写一个,自己shell不熟悉,写的有点渣渣 if [ "$#" -ne ...

随机推荐

  1. Mac下MyEclipse安装及破解

    一.安装MyEclipse 去 官网下载MyEclipse ,我这里下载的是最新版MyEclipse 2017 CI 5,安装之后不要立即打开,不然会导致后面破解失败. 二.破解 1.下载破解文件,亲 ...

  2. 李彦宏AI大会现场:3秒钟事故30分钟专注

    编辑 | 于斌 出品 | 于见(mpyujian) 很多人只看到了舞台上3秒钟的事故,却没有看到李彦宏在台上30分钟的专注. 7月3号,百度AI开发者大会上,李彦宏遭遇了3秒钟的突然袭击,他表现的沉着 ...

  3. LinkList(链表)

    code: #include <stdio.h> #include <time.h> #include <conio.h> #include <stdlib. ...

  4. 最全BT磁力搜索引擎,国外最受欢迎的BT-磁力网站(整理分享,每日不断更新...)

    最全BT磁力搜索引擎索引(整理分享,每日更新) 1.海盗湾 The Pirate Bay 2.磁力天堂(BT磁力搜索下载-磁力天堂) www.btaa.xyz  (资源多,下载速度可以,建议用手机访问 ...

  5. encypt dataset

    import getoptimport sysimport uuidimport hashlibimport csvdef getIds(totals,encrypt): seed=set() for ...

  6. Linux进程内消息总线设计

    文章目录 Windows平台进程内消息总线 如果没有消息总线,会产生什么问题 死循环包含关系 高耦合.低内聚 消息总线 结构图 原理 生产者与总线的关系 总线与消费者的关系 Linux进程内消息总线设 ...

  7. 一步步动手实现高并发的Reactor模型 —— Kafka底层如何充分利用多线程优势去处理网络I/O与业务分发

    一.从<Apeche Kafka源码剖析>上搬来的概念和图 Kafka网络采用的是Reactor模式,是一种基于事件驱动的模式.熟悉Java编程的读者应该了解Java NIO提供了Reac ...

  8. 【协作式原创】查漏补缺之Golang中mutex源码实现(预备知识)

    预备知识 CAS机制 1. 是什么 参考附录3 CAS 是项乐观锁技术,当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是 ...

  9. Mysql按照字段的重复数排序

    select source_job_number,count(*) as count from v1_user WHERE source_id=3 group by source_job_number ...

  10. js运算符的特殊应用

    是否包含指定字符: ~ 取整: | 取半: >> 成长值评级: || 判断奇偶: & 交换两个数字的值: ^= 2的n次方: << 和 ** 1 << n- ...