django-paramiko远程服务器和文件管理(五)

一、paramiko简介

1.paramiko是一个基于SSHv2协议的纯Python库。需要单独安装。
2.它提供了客户端和服务器的功能。
3.可以实现SSH2远程安全连接,支持用户名、密码连接,也支持密钥连接
4.一般用于执行远程命令、传输文件、中间SSH代理等

安装

pip3 install paramiko

在linux中安装过程报错:

Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-obpexfgv/bcrypt/

解决:

pip3 install --upgrade pip3 setuptools

二、SSH连接

1.基于用户名和密码的连接

import paramikocommand = "cat /etc/passwd |awk -F: '{print $1}'|head"# 要连接的主机的信息,以下是必填项
host_info = {"hostname": "192.168.1.23","port": 22,"username": "root","password": "服务器密码"
}def ssh_host(hostinfo):# 实例化一个SSHClient 对象,用于连接linux服务器使用ssh_client = paramiko.SSHClient()# 当使用用户名和密码首次连接linux服务器时会有连接提示,也是输入yes/no的提示。这里的设置就是会自动输入yesssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)try:# 开始连接目标linux服务器ssh_client.connect(**host_info)except Exception:print(f"连接{host_info['hostname']}失败")else:# 远程执行shell命令stdin,stdout,stderr = ssh_client.exec_command(command)# 这里decode的作用 1是解码 2是格式化print(stdout.read().decode())# 判断执行命令是否有报错,如果有报错就打印if not stderr is None:print(stderr.read().decode())ssh_client.close()if __name__ == "__main__":ssh_host(host_info)

执行结果如下:

root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

2.基于密钥的连接

import paramiko
command = "awk -F: '{print $1}' /etc/passwd"# 读取私钥文件
private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')host_info = {"hostname": "192.168.1.106","port": 22,"username": "root",# 这里就是传递私钥文件"pkey": private_key
}def main(host_info):ssh_client = paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:ssh_client.connect(**host_info)except Exception:print(f"连接{host_info['hostname']}失败")else:stdin, stdout, stderr = ssh_client.exec_command(command)# 这里decode的作用 1是解码 2是格式化print(stdout.read().decode())# 判断执行命令是否有报错,如果有报错就打印if not stderr is None:print(stderr.read().decode())ssh_client.close()if __name__ == '__main__':main(host_info)

三、远程文件操作

1.STPClient类简介

SFTPClient作为一个SFTP客户端对象,根据SSH传输协议的sftp会话,实现远程操作,比如文件上传,下载,权限,状态等,端口就是SSH端口

方法含义
from_transport()创建一个已连通的SFTP客户端通道
put()上传本地文件到远程服务器
get()从远程服务器下载文件到本地
mkdir()在远程服务器上创建目录
remove()删除远程服务器中的文件
rmdir()删除远程服务器中的目录
rename()重命名远程服务器中的文件或目录
stat()获取远程服务器中文件的详细信息
listdir()列出远程服务器中指定目录下的内容

2.代码实例:

import paramikohost_addr = ('192.168.1.23',22
)
user_info  = {"username": "root","password": "666666"}
def sftp_host():tran = paramiko.Transport(*host_addr)tran.connect(**user_info)sftp_client = paramiko.SFTPClient.from_transport(tran)local_path = "D:/服务临时交付文件/zabbix_agent-6.0.3-linux-4.12-ppc64le-static.tar.gz"remote_path = "/root/zabbix_agent-6.0.3-linux-4.12-ppc64le-static.tar.gz"# 上传文件(下发文件)sftp_client.put(local_path,remote_path)# 下载文件sftp_client.get(remote_path,local_path)tran.close()if __name__ == "__main__":sftp_host()

四、django的文件上传

1.前端代码

准备工作

1.安装node
2.使用npm 安装pnpm工具

这里使用前端代码做测试的原因:

1.原生html input type=file 太丑了
2.必须在input type=file中加入enctype="multipart/form-data"属性,此属性的含义是:规定在发送到服务器之前应该如何对表单数据进行编码。如果没有这一行,django的 request.FILES的值是空的。所以在这里使用UI组件进行测试。看看是否也存在request.FILES为空的问题

1.1 配置代理地址

淘宝的地址使用vite创建项目报错,所以这里重新配置代理

npm config set registry https://registry.npmjs.org/

1.2 使用vite创建vue项目

pnpm create vitecd 项目名称# 安装依赖
pnpm install  # 启动项目
pnpm run dev

1.3 安装UI组件

1.3.1 安装ant-design-vue
pnpm install ant-design-vue --save

查看安装的版本

E:\code\project\前端项目\vue_test1\vue_test_project>pnpm list |findstr /i ant
ant-design-vue 4.1.2
1.3.2 安装icon组件
pnpm install --save @ant-design/icons-vue

1.4 引入UI组件

编辑main.js

import { createApp } from 'vue'
import App from './App.vue'# 引入ant-desgin-vue组件的button按钮
import { Button } from 'ant-design-vue'const app = createApp(App)# 使用Button按钮组件
app.use(Button)app.mount('#app')

1.5 测试

在浏览器中能够看到漂亮的按钮,就说明这里已经成功引用了ant-desgin-vue UI组件了.

<script setup></script><template><div><h1>app.vue</h1><!-- 使用引入的button按钮 --><a-button type="primary">按钮</a-button></div>
</template><style scoped></style>

1.6 上传文件完整代码

编辑App.vue文件

<template>
<div><a-upload v-model:file-list="fileList" list-type="picture" :max-count="10" multiple="true"action="/upload" name='file' @change="handleChange"><a-button type="primary"><upload-outlined></upload-outlined>上传文件</a-button></a-upload><a-button type="primary" danger class="ClearBt" @click="clearfileList"><DeleteOutlined />清空列表</a-button>
</div>
</template><script lang="js">
export default {name: "App"
}</script><script lang="js" setup>
import { ref } from 'vue';
import { UploadOutlined,DeleteOutlined } from '@ant-design/icons-vue'
import { message } from 'ant-design-vue';const fileList = ref([
]);function clearfileList(){fileList.value = [];
}function handleChange(info){if (info.file.status == "done"){message.success(`${info.file.name} 上传成功!`)}if (info.file.status == "error"){message.error(`${info.file.name} 上传失败`)}
}
</script><style scoped>
div {position: relative;margin: 0px auto;width: 30%;height: 800px;background: #f5f5f5;border-radius: 20px;
}.ClearBt {position: absolute;top: 0px;left: 111px;
}</style>

参数解释:

list-type: 显示图片
max-count: 限制文件上传的数量
multiple:允许一次上传多个文件,而不是一次只允许上传单个文件
name: 这个参数必须要定义,否则后端无法获取前端提交的数据

main.js代码如下

import { createApp } from 'vue'
import App from './App.vue'import { Button,Upload } from 'ant-design-vue'const app = createApp(App)app.use(Button)
app.use(Upload)app.mount('#app')

1.7 编译前端代码

pnpm run build

编译成功后在 项目目录下生成dist目录,此目录下就是编译成功后的代码

2.部署前端代码

搭建nginx,过程省略

2.1 nginx server配置

server {listen 16666;server_name localhost;root /data/wwwroot;location / {index index.html;try_files $uri $uri/ /index.html;}location /upload {proxy_pass http://127.0.0.1:18888/files/upload/;}
}
nginx -s reload

2.2 上传前端代码

将编译好的所有的代码上传到/data/wwwroot目录下。访问:

http://IP地址:16666

3.部署后端代码

基础环境安装就不在说了

3.1 创建应用

django-admin startapp files

3.2 主路由

编辑项目目录下的urls.py文件

from django.urls import path,includeurlpatterns = [path('files/',include('files.urls'))
]

3.3 子路由

在files应用下新建urls.py文件

from django.urls import path,include
from .views import *urlpatterns = [path('upload/', file_view.as_view()),
]

3.4 视图类

from rest_framework.views import  APIView
from rest_framework.response import Response
import ossave_url = '/data/pic/'class file_view(APIView):def post(self,request):# 获取前端上传的文件,注意这里get的 'file' 一定和前端upload 的name的值对应pic_data = request.FILES.get('file')# 判断是否能够获取到前端传输的数据,主要是看前端upload的name值是不是fileif not pic_data is None:pic_name = pic_data.namepicFullUrl = save_url + pic_name# 判断上传的文件是否重名if not os.path.exists(picFullUrl):with open(save_url + pic_name,'wb+') as fp:# 这里使用chunks函数,是为分块处理,为了避免如果文件很大,一次性读取文件所有,而造成的内存不足现象for chunk in pic_data.chunks():fp.write(chunk)return Response({"message":"文件上传成功"},status=200)else:# 这里之所有没有使用键值对的形式进行返回,是因为这个异常结果会显示在图片的悬浮提示上。return  Response("文件已经存在",status=409)else:# 这里之所有没有使用键值对的形式进行返回,是因为这个异常结果会显示在图片的悬浮提示上。return  Response("文件上传失败",status=505)

3.5 启动项目

python3 manage.py  runserver 0.0.0.0:18888

4.访问测试

访问页面,查看图片是否能够上传成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组、冒泡排序、函数、作用域、对象、Math

数组 1.定义数组&#xff1a; a)通过字面量的方式定义数组 let ary[1,2,3,4]b)通过定义构造函数的方式定义数组&#xff1a; let 数组名new Array(值,值,值);数组的操作方式 a)增 //在数组末尾添加值 arr.push(新增的内容) //在数组的开始添加值 arr.unshift(新增的内容)b…

Redis主从复制+Redis哨兵模式+Redis群集模式

Redis主从复制Redis哨兵模式Redis群集模式一、Redis主从复制1、主从复制的作用2、主从复制过程3、搭建Redis主从复制3.1 所有节点服务器安装redis3.2 修改Redis配置文件(Master节点操作)3.3 修改Redis配置文件(Slave节点操作)3.4 验证主从效果 二、Redis哨兵模式1、哨兵模式的作…

8、IBOScms代码审计

一、sql注入 1、sql注入(Ⅰ) 限制 rreport/api/getlist {"offset":0,"type":"send","keyword":{"subject":"111) AND (updatexml(1,concat(0x7e,(select user()),0x7e),1))-- qw"}}复现 POST /?rreport/api/…

Vue开发实例(十一)用户列表的实现与操作

用户列表的实现与操作 一、创建用户页面和路由二、表格优化1、表头自定义2、表格滚动3、加入数据索引4、利用插槽自定义显示 三、功能1、查询功能3、增加4、删除5、修改 一、创建用户页面和路由 创建用户页面 在 src/components/Main 下创建文件夹user&#xff0c;创建文件Us…

Java ZooKeeper-RocketMQ 面试题

Java ZooKeeper-RocketMQ 面试题 前言1、谈谈你对ZooKeeper的理解 &#xff1f;2、Zookeeper的工作原理&#xff08;Zab协议&#xff09;3、谈谈你对分布式锁的理解&#xff0c;以及分布式锁的实现&#xff1f;4、 zookeeper 是如何保证事务的顺序一致性的&#xff1f;5、 zook…

设计模式之策略模式详解

目录 什么是策略模式 应用场景 业务场景实现 抽象类 实现类 Context上下文 测试类 策略模式的优缺点 什么是策略模式 他将定义的算法家族、分别封装起来&#xff0c;让他们之间可以相互替换&#xff0c;从而让算法的变化不会影响到使用算法的用户。 策略模式使用的就是…

idea出现莫名其妙错的时候

正常情况idea使用起来都很顺手&#xff0c;但是当项目比较多的时候&#xff0c;可能出现莫名奇妙的错误&#xff0c;比如导入的包始终报错java: 程序包com不存在&#xff0c;或者引入自己写的包也不存在&#xff0c;或者始终出现红线但是排查之后没有问题的情况&#xff0c;这种…

进来吧,给自己10分钟,这篇文章带你直接学会python

Python的语言特性 Python是一门具有强类型(即变量类型是强制要求的)、动态性、隐式类型(不需要做变量声明)、大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言。 获取帮助 你可以很容易的通过Python解释器获取帮助。如果你想知道一个对象(o…

OJ:链表的中间结点

876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 思路 思路&#xff1a;首先最容易想到的思路是什么呢&#xff0c;就是先遍历一遍链表&#xff0c;用一个值count来记录链表的长度&#xff0c;然后我们运用除法&#xff0c;/2&#xff0c;结果是几&#xff0c;就…

【C++干货基地】揭秘C++11常用特性:内联函数 | 范围for | auto自动识别 | nullptr指针空值

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

平台工程: 用Backstage构建开发者门户 - 2

本文介绍了如何使用开源Backstage构建自己的开发者门户&#xff0c;并基于此实践平台工程。本系列共两篇文章&#xff0c;这是第二篇。原文: Platform Engineering: Building Your Developer Portal with Backstage — Part 2 在本教程第一部分中我们了解了Backstage这个用于构…

外贸网站模板建站

测绘检测wordpress外贸主题 简洁实用的wordpress外贸主题&#xff0c;适合做测绘检测仪器设备的外贸公司使用。 https://www.jianzhanpress.com/?p5337 白马非马衣服WordPress外贸建站模板 白马非马服装行业wordpress外贸建站模板&#xff0c;适用于时间服装企业的官方网站…

Git 如何上传本地的所有分支

Git 如何上传本地的所有分支 比如一个本地 git 仓库里定义了两个远程分支&#xff0c;一个名为 origin&#xff0c; 一个名为 web 现在本地有一些分支是 web 远程仓库没有的分支&#xff0c;如何将本地所有分支都推送到 web 这个远程仓库上呢 git push web --all

pytorch loss函数整理

变量名解释 logits&#xff1a;未经过normalize&#xff08;未经过激活函数处理&#xff09;的原始分数&#xff0c;例如一个mlp将特征映射到num_target_class维的输出tensor就是logits。 probs&#xff1a;probabilities的简写&#xff0c;logits经过sigmoid函数&#xff0c;…

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…

Jenkins的Pipeline概念

文章目录 Pipeline什么是Jenkins Pipeline声明式和脚本式Pipeline语法为何使用PipelinePipeline概念PipelineNodeStageStep Pipeline语法概述声明式Pipeline脚本式Pipeline Pipeline示例 参考 Pipeline 什么是Jenkins Pipeline Jenkins Pipeline是一套插件&#xff0c;它支持…

【Django】model模型—模型继承

Django中三种继承风格 抽象基类&#xff1a;仅将父类用于子类公共信息的载体&#xff0c;这样的父类永远都不会单独使用。多表继承&#xff1a;继承了一个模型&#xff08;可能来源其它应用&#xff09;&#xff0c;且想要每个模型都有对应的数据表。代理模型&#xff1a;只想…

JProfiler相关问题及答案(2024)

1、JProfiler是什么及其用途 JProfiler是一款功能丰富的商业Java性能剖析&#xff08;profiling&#xff09;工具&#xff0c;它主要面向开发者和性能分析师&#xff0c;用于监测和分析Java应用程序的运行时行为。以下是对JProfiler的一些详细介绍和它的主要用途&#xff1a; …

webpack的一些知识

核心 webpack 是用来搭建前端工程的它运行在node环境中&#xff0c;它所做的事情&#xff0c;简单来说&#xff0c;就是打包具体来说&#xff0c;就是以某个模块作为入口&#xff0c;根据入口分析出所有模块的依赖关系&#xff0c;然后对各种模块进行合并、压缩&#xff0c;形…

洛谷P1157 组合的输出

深搜板子加一点点修改&#xff0c;适合初学者体会深搜&#xff0c;具体看代码 题目链接 ACcode #include<bits/stdc.h>using namespace std;int a, b;bitset<50>vis;//剪枝 int d[50];void dfs(int x) {if (x b 1) {for (int i 1;i < b;i)cout << se…