1.paramiko概述
ssh是一个协议,OpenSSH是其中一个开源实现,paramiko是Python的一个库,实现了SSHv2协议(底层使用cryptography)。
有了Paramiko以后,我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对远程服务器进行操作。
由于paramiko属于第三方库,所以需要使用如下命令先行安装
2.安装paramiko
pip install paramiko
3.常用方法
connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。
hostname 连接的目标主机
port=SSH_PORT 指定端口
username=None 验证的用户名
password=None 验证的用户密码
pkey=None 私钥方式用于身份验证
key_filename=None 一个文件名或文件列表,指定私钥文件
timeout=None 可选的tcp连接超时时间
allow_agent=True, 是否允许连接到ssh代理,默认为True 允许
look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
compress=False, 是否打开压缩
set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:
设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
exec_command():在远程服务器执行Linux命令的方法。
如 exec_command("ls /") exec_command("df -h")
4.使用方法
import paramiko
# 实例化SSHClient
client = paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接SSH服务端,以用户名和密码进行认证
client.connect(hostname='192.168.1.1', port=22, username='root', password='123456')
# 打开一个Channel并执行命令
stdin, stdout, stderr = client.exec_command('df -h ') # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
# 打印执行结果
print(stdout.read().decode('utf-8'))
# 关闭SSHClient
client.close()
5.利用多线程实现ssh并发访问
编写一个remote_comm.py脚本,实现以下功能:
在文件中取出所有远程主机IP地址
在shell命令行中接受远程服务器IP地址文件、远程服务器密码以及在远程主机上执行的命令
通过多线程实现在所有的远程服务器上并发执行命令
步骤一:编写脚本
#!/usr/bin/env python3
import sys
import getpass
import paramiko
import threading
import os
#创建函数实现远程连接主机、服务器密码以及在远程主机上执行的命令的功能
def remote_comm(host, pwd, command):
#创建用于连接ssh服务器的实例
ssh = paramiko.SSHClient()
#设置自动添加主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接ssh服务器,添加连接的主机、用户名、密码填好,捕获异常,有异常则跳出函数
ssh.connect(hostname=host, username='root', password=pwd)
except:
return
#在ssh服务器上执行指定命令,返回3项类文件对象,分别是,输入、输出、错误
stdin, stdout, stderr = ssh.exec_command(command)
#读取输出
out = stdout.read()
#读取错误
error = stderr.read()
#如果有输出
if out:
#打印主机输出内容
print('[%s] OUT:\n%s' % (host, out.decode('utf8')))
#如果有错误
if error:
#打印主机错误信息
print('[%s] ERROR:\n%s' % (host, error.decode('utf8')))
#程序结束
ssh.close()
if __name__ == '__main__':
#设定sys.argv长度,确保remote_comm函数中参数数量
if len(sys.argv) != 3:
print('Usage: %s ipaddr_file "command"' % sys.argv[0])
exit(1)
#判断命令行上输入如果不是文件,确保输入的是文件
if not os.path.isfile(sys.argv[1]):
print('No such file:', sys.argv[1])
exit(2)
#fname为存储远程主机ip的文件,用sys.argv方法,可以在执行脚本时再输入文件名,更为灵活
fname = sys.argv[1]
#command为在远程主机上执行的命令,用sys.argv方法,可以在执行脚本时再输入相应命令,command为remote_comm函数第三个参数
command = sys.argv[2]
#通过getpass输入远程服务器密码,pwd为remote_comm函数第二个参数
# pwd = getpass.getpass()
pwd='Taren1.bgsn'
#打开存有远程主机ip的文件
with open(fname) as fobj:
#将遍历文件将ip以列表形式存入ips,line.strip()可以去掉每行ip后\n
ips = [line.strip() for line in fobj]
#循环遍历列表,获取ip地址,ip为remote_comm函数第一个参数
for ip in ips:
#将读取到的ip地址作为remote_comm函数实际参数传递给函数,ips中有几个ip地址循环几次
#创建多线程
t = threading.Thread(target=remote_comm, args=(ip, pwd, command))
#启用多线程
t.start()
[Linux/apache问题]
Pycharm debug调试时带参数过程解析
[Linux/apache问题]
详解字符串在Python内部是如何省内存的
[Linux/apache问题]
centos7搭建hadoop2.10高可用(HA)
[Linux/apache问题]
解决小程序无法触发SESSION问题
[Linux/apache问题]
用js实现下载远程文件并保存在本地的脚本
[Linux/apache问题]
php防止站外远程提交表单的方法
[Linux/apache问题]
Android远程服务编写和调用教程
[Linux/apache问题]
Java编码摘要算法实例解析
[Linux/apache问题]
解决maven第一次创建项目太慢的问题
[Linux/apache问题]
linux下php安装xml扩展的详细步骤
[Linux/apache问题]
python爬取王者荣耀全皮肤的简单实现代码
[Linux/apache问题]
Win10里python3创建虚拟环境的步骤
[Linux/apache问题]
解决mysql5.6 utf8设置无效问题
[Linux/apache问题]
Python如何通过Flask-Mail发送电子邮件
[Linux/apache问题]
基于TensorFlow中自定义梯度的2种方式
[Linux/apache问题]
TensorFlow MNIST手写数据集的实现方法
[Linux/apache问题]
Android 添加系统服务的方法详解
[Linux/apache问题]
处理Shell脚本中带有空格的变量(bash脚本)
[Linux/apache问题]
树莓派4安装Ubuntu 19.10的教程详解
[Linux/apache问题]
深度操作系统 deepin 15.11安装 QGIS 3.4
[Linux/apache问题]
PHP设计模式之组合模式定义与应用示例
[Linux/apache问题]
MongoDB启动报错 28663 Cannot start server
[Linux/apache问题]
Python warning警告出现的原因及忽略方法
[Linux/apache问题]
Python异步编程之协程任务的调度操作实例分析
[Linux/apache问题]
C++实现涂色游戏(博弈)
[Linux/apache问题]
SELinux 入门详解
[Linux/apache问题]
总结Linux 6种日志查看方法
[Linux/apache问题]
Linux查看系统配置常用命令详解
[Linux/apache问题]
SELINUX工作原理详解
[Linux/apache问题]
如何在Linux中的特定时间运行命令
[实用记录]
BAT 新建文件夹
[实用记录]
EXCEL 对比A B两列数据是否一致
[实用记录]
收录太慢?请不要病急乱投医!