用POST请求在Linux之间传输文件(Python在Linux间传输文件)

背景

实际需求:

  • 已通过iperf和dd命令测试过两台不同区域之间的Linux服务器带宽,均为1000Mb网络。
  • 但发送post请求传输文件至对象存储时,总是卡在14Mb/s。
  • 除了排查区域之间的防火墙,也应该尝试检查Linux(KylinV10)之间是否存在默认系统配置限制了POST请求发送文件的带宽。
  • 因此:须在两台KylinV10之间直接通过POST请求发送文件,通过iftop监控网络带宽,排除操作系统对post带宽限制的可能。

解决:

  • A服务器上使用python编写server端程序,接收post请求,并将文件转存至文件目录。
  • B服务器上创建测试文件,通过post请求发送至A服务器。
  • 在A/B上运行iftop工具监控网络带宽、检查目标目录是否成功转存文件。

扩展:

  • 在禁用ssh和22端口的情况下,可通过rest接口在Linux之间传输大文件。

解决

1.安装python依赖库:flask和request

在A服务器上安装python程序需要的环境

dnf install python3
dnf install python3-pip
pip install requests -i https://mirrors.aliyun.com/pypi/simple/
pip install flask -i https://mirrors.aliyun.com/pypi/simple/

离线安装python和pip模块时,可下载我整理的rpm和whl压缩包(资源已上传,等待审核),上传至Linux服务器解压后执行以下命令:

#使用本地repo源安装python
tar -zxvf czm-231108-KylinV10-PythonREST.tgz 
cp python-rpm/python.repo /etc/yum.repos.d/
sudo dnf install python3
sudo dnf install python3-pip
#pip安装本地whl模块
cd pip-module/
ll
total 1216
-rw-r--r-- 1 sysma sysma 158334 Nov  8 14:40 certifi-2023.7.22-py3-none-any.whl
-rw-r--r-- 1 sysma sysma 136822 Nov  8 14:40 charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
-rw-r--r-- 1 sysma sysma  97941 Nov  8 14:40 click-8.1.7-py3-none-any.whl
-rw-r--r-- 1 sysma sysma 101817 Nov  8 14:40 Flask-2.2.5-py3-none-any.whl
-rw-r--r-- 1 sysma sysma  61538 Nov  8 14:40 idna-3.4-py3-none-any.whl
-rw-r--r-- 1 sysma sysma  22934 Nov  8 14:40 importlib_metadata-6.7.0-py3-none-any.whl
-rw-r--r-- 1 sysma sysma  15749 Nov  8 14:40 itsdangerous-2.1.2-py3-none-any.whl
-rw-r--r-- 1 sysma sysma 133101 Nov  8 14:40 Jinja2-3.1.2-py3-none-any.whl
-rw-r--r-- 1 sysma sysma  25427 Nov  8 14:40 MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
-rw-r--r-- 1 sysma sysma  62574 Nov  8 14:39 requests-2.31.0-py3-none-any.whl
-rw-r--r-- 1 sysma sysma  33232 Nov  8 14:40 typing_extensions-4.7.1-py3-none-any.whl
-rw-r--r-- 1 sysma sysma 124213 Nov  8 14:40 urllib3-2.0.7-py3-none-any.whl
-rw-r--r-- 1 sysma sysma 233551 Nov  8 14:40 Werkzeug-2.2.3-py3-none-any.whl
-rw-r--r-- 1 sysma sysma   6758 Nov  8 14:40 zipp-3.15.0-py3-none-any.whl

pip install --no-index --find-link=flask flask

2.编写server端程序:接收post传输文件请求

在A服务器上创建python程序文件,直接复制后续代码,存储为xxx.py文件即可运行,此处我命名为01-PostReciveFile.py

具体程序代码如下:

from flask import Flask, request

app = Flask(__name__)

@app.route('/upload', methods=['POST'])		#指定接口名称为upload,指定请求方法为POST
def upload_file():
    if 'file' not in request.files:
        return 'No file part in the request', 400
    file = request.files['file']
    if file.filename == '':
        return 'No selected file', 400
    if file:
        file.save('/opt/' + file.filename)   #将接收的文件转存至/opt目录,可以改为任意目录,但要保证程序运行所属用户对目录有写权限。
        return 'File uploaded successfully', 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)	#指定程序使用的端口,可改为其它任意非系统端口。

然后即可直接运行程序 python 01-PostReciveFile.py,示例如下:

[root@jenkins ~]# python 01-PostReciveFile.py 
 * Serving Flask app '01-PostReciveFile'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://10.42.40.27:5000
Press CTRL+C to quit

出现上述内容即表明程序已经启动,监听端口为5000,上传接口为/upload。

3.创建测试文件:dd创建文件

在B服务器上创建测试文件,执行dd命令即可。of指定了testfile-2GB.mp4是要创建的文件名,bs=1M表示每个块的大小为1MBcount=2048表示要创建2048个块,可根据需要创建不同大小的文件。示例如下

dd if=/dev/zero of=testfile-2GB.mp4 bs=1M count=2048	#创建一个2GB文件
dd if=/dev/zero of=testfile-100MB.mp4 bs=1M count=100	#创建一个100MB文件

4.发起post请求传输文件

file=@后填入将要传输的测试文件,带路径也行,然后发送请求到运行server端程序的A服务器:
此处我的A(server端)服务器是10.42.40.27

 curl -X POST -F "file=@testfile-100MB.mp4 " http://10.42.40.27:5000/upload

5.监控网络带宽,检查文件转存状态

kylinV10\RockyLinux9\CentOS7都没有默认安装iftop命令,使用默认安装包源,使用yumdnf都没办法直接安装的话,直接下载这个安装包【iftop-1.0-0.21.pre4.el7.x86-64.rpm】,然后执行rpm -ivh 即可,确认该安装包可在el7和el8上安装。

rpm -ivh iftop-1.0-0.21.pre4.el7.x86_64.rpm 
[root@localhost python-rpm]# rpm -ivh iftop-1.0-0.21.pre4.el7.x86_64.rpm 
警告:iftop-1.0-0.21.pre4.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID 352c64e5: NOKEY
Verifying...                          ################################# [100%]
准备中...                          ################################# [100%]
正在升级/安装...
   1:iftop-1.0-0.21.pre4.el7          ################################# [100%]
[root@localhost python-rpm]# 

在这里插入图片描述
在这里插入图片描述

结束

结论: post直接传输文件时,网络带宽没有限制。至少验证了KylinV10没有对POST请求带宽做限制。
进一步排查: 已确认2台不通区域Linux之间访问带宽低的问题原因是物理防火墙策略造成,已处理。

扩展

突然反应过除了测试,还有一个更好的使用场景:
在Linux的22端口被关闭、ssh协议被禁用的情况下,SCP命令无法使用的情况下,你可以通过REST接口指定其它TCP端口来传输文件了,朋友。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python中如何理解这种书写代码的语法??def cracking_passwords(zfile: ZipFile, pwd: str) -> bool:

def cracking_passwords(zfile: ZipFile, pwd: str) -> bool: # Author : 小红牛 # 微信公众号:wdPython这是一种使用Python的函数定义语法。这个函数被命名为cracking_passwords,它接受两个参数:zfile和pwd。参数的类型被标注为ZipFile和…

Java Swing程序设计-18章

Java Swing程序设计-18章 1.Swing概论 Swing是用于创建图形用户界面(GUI)的一组API(应用程序编程接口)。Swing提供了丰富的组件,用于构建用户友好的界面,包括按钮、文本框、标签、列表、表格等。以下是Sw…

c语言练习第10周(1~5)

根据公式求和 输入样例20输出样例 534.188884 #include<stdio.h> #include<math.h> int main() {int i,n;scanf("%d", &n);double s 0,t0;for (i 1; i < n; i) {t t sqrt(i);s s t;}printf("%.6lf", s);return 0; } 第一行输入…

Selenium爬取内容并存储至MySQL数据库

前面我通过一篇文章讲述了如何爬取博客摘要等信息。通常,在使用Selenium爬虫爬取数据后,需要存储在TXT文本中,但是这是很难进行数据处理和数据分析的。这篇文章主要讲述通过Selenium爬取我的个人博客信息,然后存储在数据库MySQL中,以便对数据进行分析,比如分析哪个时间段…

0成本LLM微调上手项目,⚡️一步一步使用colab训练法律LLM,基于microsoft/phi-1_5,包含lora微调,全参微调

项目地址 &#xff1a;https://github.com/billvsme/train_law_llm ✏️LLM微调上手项目 一步一步使用Colab训练法律LLM&#xff0c;基于microsoft/phi-1_5 。通过本项目你可以0成本手动了解微调LLM。 nameColabDatasets自我认知lora-SFT微调train_self_cognition.ipynbsel…

Python基础入门----Python虚拟环境:为何要用虚拟环境、如何使用virtualenv

文章目录 在Python开发中,虚拟环境是一个独立的目录树,可以在其中安装Python模块。每个虚拟环境都有自己的Python二进制文件和一组安装的库。使用虚拟环境的主要原因是为了避免项目间的依赖冲突,允许每个项目有其特定的依赖,而不影响全局安装的模块。 为何要用虚拟环境 依…

IntelliJ IDEA - Git Commit 后 Commit 窗口不消失解决方案

这个现象是在 2023 年版本后开始的&#xff0c;一开始以为是 Mac 系统的原因&#xff0c;后来发现原来 Windows 也这样&#xff0c;所以应该只跟 IDEA 版本有关 可以看到左侧 commit 后&#xff0c;这个侧边栏还在&#xff0c;按理讲在以前的版本是之前消失&#xff0c;这样使…

Go 语言初探:从基础到实战

1.Go概述 程序是一段计算机指令的有序组合。程序算法数据结构。任何程序都可以将模块通过三种基本的控制结构&#xff08;顺序、分支、循环&#xff09;进行组合来实现。 Go&#xff08;也称为Golang&#xff09;是一种由Google开发的开源编程语言。设计目标是使编程更简单、…

62、使用python进行rk3588开发板进行推流亚马逊云服务上,进行实时播放

基本思想:之前写了一套c++的推理和视频编解码,使用rk3588的mpp硬件进行编码和解码,然后使用RTSPServer进行推流,总是有问题,虽然可以使用ffplay和vlc进行拉取和播放,但是就是无法使用gstreamer推流到亚马逊云服务上,因为项目需求的紧急,所以先用python把流程跑同,后续…

视频转码教程:轻松制作GIF动态图,一键高效剪辑操作

随着社交媒体的兴起&#xff0c;GIF动态图已经成为了人们表达情感、分享精彩瞬间的重要方式。而将视频转化为GIF动态图&#xff0c;不仅可以方便地在社交媒体上分享&#xff0c;还可以延长视频的播放时长&#xff0c;吸引更多的观众。本篇文章将为大家介绍如何将视频轻松转化为…

为什么冰酒会被视为珍品?

在某些年份&#xff0c;珍贵稀有的葡萄酒让酿酒师有了冒险的意愿&#xff0c;葡萄比平时在藤上停留更长时间&#xff0c;需要等待至少-7℃的温度&#xff0c;酿酒师需要与自然玩游戏&#xff0c;可以持续到1月&#xff0c;在罕见的情况下可以持续到2月。对于酿酒师来说&#xf…

雨云 宿迁 14900KF 高防云服务器性能测评

雨云游戏云上线了用I9 13900KF做CPU的VPS服务器&#xff0c;雨云游戏云VPS的14900KF和13900KF机型是纯大核的&#xff08;屏蔽小核&#xff09;保证你的VPS不会被分配到小核上而导致性能下降&#xff0c;水冷散热&#xff0c;超频至6.3Ghz&#xff0c;超高单核性能。 适合开我…

openai自定义API操作 API 返回值说明

custom-自定义API操作 openai.custom 公共参数 名称类型必须描述keyString是调用key&#xff08;获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheStrin…

申克SCHENCK动平衡机显示器维修CAB700系统控制面板

适用电枢转子的卧式平衡机&#xff0c;高测量率&#xff0c;自动测量循环&#xff0c;自动定标完整的切槽计数可选项&#xff0c;CAB700动平衡测量系统两种皮带驱动方式(上置式或下置式)适用于站立或坐姿操作的人性化工作台设计。 动平衡机申克控制器面板维修型号&#xff1a;V…

wandb 安装本地部署使用教程

1、官网注册 wandb.ai是一个为机器学习开发者提供的开发工具平台&#xff0c;可以帮助用户跟踪实验&#xff0c;管理和版本数据&#xff0c;以及与团队协作&#xff0c;从而更专注于构建最佳模型。 wandb官网&#xff1a; https://wandb.ai 首先我们打开官网注册号自己的账号并…

1 快速了解Paimon数据湖核心原理及架构

1.1 什么是Apache Paimon Apache Paimon的前身属于Flink的子项目&#xff1a;Flink Table Store。 目前业内主流的数据湖存储项目都是面向批处理场景设计的&#xff0c;在数据更新处理时效上无法满足流式数据湖的需求&#xff0c;因此Flink社区在2022年的时候内部孵化了 …

【uniapp】解决在H5谷歌浏览器下 u-input 标签 设置只读后,click事件不生效

【问题描述】 谷歌浏览器更新后&#xff0c;h5模式下原本的input外层view中的click事件不触发了?? 但是更换浏览器后就可以&#xff0c;打包app也是正常可以触发的&#xff0c;本来是没打算兼容h5&#xff0c;既然遇到了就记录一下~ 【解决办法】 使u–input里写上readonly&…

Android学习笔记(五)

Web连接服务器 连接web服务器两种方式 一 重写URL地址(get post) package com.example.gdget; public class MainActivity extends Activity { private Button downImage; private ImageView showImage; private static String URL_PATH"http://192.168.1.…

Tkinter创建菜单窗口

一、说明 本文专门记录如何添加Tkinter的菜单&#xff0c;包括&#xff0c;菜单如何生成&#xff0c;菜单如何布局&#xff0c;菜单如何绑定回调函数&#xff0c;并安排代码示例&#xff0c;凡期望做菜单界面的读者&#xff0c;可以全面参考。 二、创建菜单实现步骤 2.1 总体…

基于SSM的旅游管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…