基于python的SSH协议的实现链接Linux服务器
paramiko模块
基于python的SSH协议的实现
作用:
1、远程执行命令
2、上传、下载文件
安装模块
> pip install paramiko
一、配置虚拟环境
在CMD命令行进行操作
虚拟环境的操作步骤
1、创建虚拟环境
例 python -m venv 虚拟环境名称
C:\Users\martin>d: //进入D盘
D:\>python -m venv projectA_venv
2、进入虚拟环境
D:\>cd projectA_venv
D:\projectA_venv>cd Scripts
D:\projectA_venv\Scripts>activate
(projectA_venv) D:\>pip install pymysql //安装数据库
3、退出虚拟环境
(projectA_venv) D:\projectA_venv\Scripts>deactivate.bat
二、远程命令执行
1、远程单条命令执行 Python代码实现
import paramiko
def exeCMD(): #杨玉庭
# 创建ssh客户端工具
ssh_client = paramiko.SSHClient()
# 设置丢失主机密钥的策略为自动添加
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 创建与服务器的SSH连接
ssh_client.connect(hostname="192.168.84.2", port=22, username="root", password="redhat")
# 执行命令
'''
返回三个特殊文件, 标准输入、标准输出、标准错误输出
标准输入:用于向交互式命令传递参数
标准输出:保存命令的正常执行结果
标准错误输出:保存命令的报错信息
'''
stdin, stdout, stderr = ssh_client.exec_command("ifconfig")
print(stdout.read().decode("utf-8"))
ssh_client.close()
if __name__ == '__main__':
exeCMD()
运行结果
2、远程批量执行命令
代码实现:
import paramiko
import sys
#杨玉庭
def exeCMD(ip, username, password, cmd, port=22):
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh_client.connect(hostname=ip, username=username, password=password, port=port)
except Exception as e:
print("服务器%s连接失败!!!" % ip)
print(e)
sys.exit()
stdin,stdout,stderr = ssh_client.exec_command(cmd)
cmd_result = stdout.read().decode("utf-8")
ssh_client.close()
return cmd_result
if __name__ == '__main__':
servers = {
"192.168.84.2":{
"user": "root",
"password":"redhat",
"port": 22
},
# "192.168.183.11": {
# "user": "root",
# "password": "redhat",
# "port": 22
# }
}
cmd = input("执行命令>>> ").strip()
for ip, info in servers.items():
result = exeCMD(ip=ip, username=info.get("user"),password=info.get("password"),port=info.get("port"), cmd=cmd)
print("服务器%s执行%s命令的结果: " % (ip, cmd))
print(result)
print("---------" * 10)
3、Linux部分实现
设置IP地址
关闭防火墙
三、文件的上传与下载
1、Python代码实现
import paramiko
import os
import sys
def fileOP():
# 创建服务器的SSH连接
ssh_conn = paramiko.Transport(("192.168.84.2", 22))
# 进行用户名、密码认证
ssh_conn.connect(username="root", password="redhat")
# 基于现有的SSH连接创建ftp客户端
ftp_client = paramiko.SFTPClient.from_transport(ssh_conn)
ftp_client.put(r"D:\28\yyt\yy\test.jpeg", "/tmp/test.jpeg")
#ftp_client.get("/tmp/yyt", r"D:\28\yyt\yy") #文件下载
ftp_client.close()
ssh_conn.close()
if __name__ == '__main__':
fileOP()
2、Linux服务端测试结果
基于以上的Linux的配置进行测试:
在/tmp/下test.jepg的图片已经上传成功
文件下载命令改换为:
ftp_client.get("/tmp/yyt", r"D:\28\yyt\yy") #文件下载,前面为远程路径,后面为本地路径