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.pswp.cn/news/716393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716393.shtml
英文地址,請注明出處:http://en.pswp.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…