跨服务器的数据自动化下载

    • 功能介绍:
    • 上代码:

发现好久没写csdn了,说多了都是泪~~
以后会更新一些自动化工作的脚本or 小tricks,欢迎交流。在这里插入图片描述分享一个最近在业务上写的较为实用的自动化脚本,可以批量从远端服务器下载指定数据到当前程序运行服务器,无需每次都输入密码,通过集成安装公钥的功能,实现免密下载。这个方式适合这种不能安装 sshpass又想全自动化的环境。

功能介绍:

第一次运行:会提示输入一次远端 服务器 的密码(安装公钥)。安装完成后立即用免密下载。
以后运行:直接免密下载,全自动。
后续所有下载脚本全自动化,不用再输入任何密码,也不依赖额外工具。
以从远端服务器(账户:abc)下载数据为例。

上代码:

#!/usr/bin/env python3
import sys
import os
import subprocess
import tempfile
import shutildef check_key_auth(remote_username, remote_host, private_key_path):"""检查是否已配置免密"""result = subprocess.run(['ssh', '-i', private_key_path, '-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=no',f'{remote_username}@{remote_host}', 'echo ok'],stdout=subprocess.PIPE, stderr=subprocess.PIPE)return result.returncode == 0def install_pubkey(remote_username, remote_host, private_key_path):"""将本地公钥写入远端 authorized_keys(会要求输入密码一次)"""pubkey_path = private_key_path + '.pub'if not os.path.exists(pubkey_path):print(f"未找到公钥文件 {pubkey_path}")return Falsewith open(pubkey_path, 'r') as f:pubkey_content = f.read().strip()print(f"正在将公钥写入 {remote_host},需要输入 {remote_username} 的密码...")cmd = ['ssh', f'{remote_username}@{remote_host}',f'mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo "{pubkey_content}" >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys']return subprocess.run(cmd).returncode == 0def download_files_batch(remote_username, remote_host, private_key_path, files_to_download):"""批量下载实现:1. 在本地创建一个临时目录 tmpdir2. 用 single scp 命令把所有 remote:files 下载到 tmpdir(scp 支持多个 source + 单个 destination directory)3. 将 tmpdir 下的文件移动到各自的目标位置"""# 先保证目标本地目录存在(创建父目录)for _, local_path in files_to_download:os.makedirs(os.path.dirname(local_path), exist_ok=True)tmpdir = tempfile.mkdtemp(prefix='download_')try:# 构造 scp 命令:scp -i key user@host:/path/to/file1 user@host:/path/to/file2 ... <tmpdir>scp_cmd = ['scp', '-i', private_key_path, '-o', 'StrictHostKeyChecking=no']for remote_path, _ in files_to_download:scp_cmd.append(f'{remote_username}@{remote_host}:{remote_path}')scp_cmd.append(tmpdir)  # scp 要求最后是目标目录print("执行 scp,目标临时目录:", tmpdir)print("scp 命令:", ' '.join(scp_cmd))proc = subprocess.run(scp_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)if proc.returncode != 0:print("批量 scp 失败,错误信息:")print(proc.stderr.decode(errors='ignore'))return False# scp 成功,把文件从 tmpdir 移动到最终位置for remote_path, local_path in files_to_download:fname = os.path.basename(remote_path)src = os.path.join(tmpdir, fname)if not os.path.exists(src):print(f"警告:远端文件 {remote_path} 未被下载到临时目录({src} 不存在)")# 继续处理其它文件continueshutil.move(src, local_path)print(f"已移动:{src} -> {local_path}")print("全部文件处理完成。")return Truefinally:# 清理临时目录(如果里面还有剩余文件,会一并删除)try:shutil.rmtree(tmpdir)except Exception as e:print("清理临时目录时出错:", e)def main():if len(sys.argv) != 2:print("用法: python fully_auto_download.py <date>")sys.exit(1)date = sys.argv[1]remote_host = "" ##你需要获取数据的远端ipremote_username = "abc"private_key_path = '/.ssh/id_rsa'files_to_download = [(f"/data/{date[:4]}/{date}_000000_000000.csv",f"/save/{date}_000000_000000.csv"),## 此处省略其他需要下载的数据]# 检查免密if not check_key_auth(remote_username, remote_host, private_key_path):print("未检测到免密,开始安装公钥...")if not install_pubkey(remote_username, remote_host, private_key_path):print("公钥安装失败,请检查密码是否正确或远端权限设置。")sys.exit(1)if not check_key_auth(remote_username, remote_host, private_key_path):print("免密配置仍然失败,请手动检查。")sys.exit(1)print("免密配置成功!")# 一次性批量下载ok = download_files_batch(remote_username, remote_host, private_key_path, files_to_download)if not ok:print("批量下载出现问题,退回逐个下载尝试。")# 如果批量下载失败,可以回退到逐个 scp(免密已经配置好了,不会再要求密码)for remote_path, local_path in files_to_download:try:os.makedirs(os.path.dirname(local_path), exist_ok=True)scp_cmd = ['scp', '-i', private_key_path, '-o', 'StrictHostKeyChecking=no',f'{remote_username}@{remote_host}:{remote_path}', local_path]subprocess.run(scp_cmd, check=True)print(f"下载成功: {local_path}")except subprocess.CalledProcessError as e:print(f"下载失败: {local_path}, 错误: {e}")if __name__ == "__main__":main()

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

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

相关文章

C++-->stl: list的使用

前言list的认识list是可以在固定时间&#xff08;O&#xff08;1&#xff09;&#xff09;内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0…

本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕

1. 实现功能 M4-1 接入 whisper ollama qwen3:14b 总结字幕 自动下载视频元数据如果有字幕&#xff0c;只下载字幕使用 ollama 的 qwen3:14b 对字幕内容进行总结 2.运行效果 source /root/anaconda3/bin/activate ytdlp &#x1f50d; 正在提取视频元数据… &#x1f4dd; 正在…

《Linux运维总结:Shell脚本高级特性之变量间接调用》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、变量间接调用 在Shell脚本中&#xff0c;变量间接调用是一种高级特性&#xff0c;它允许你通过另一个变量的值来动态地访问…

ABP VNext + Akka.NET:高并发处理与分布式计算

ABP VNext Akka.NET&#xff1a;高并发处理与分布式计算 &#x1f680; 用 Actor 模型把高并发写入“分片→串行化”&#xff0c;把锁与竞态压力转回到代码层面的可控顺序处理&#xff1b;依托 Cluster.Sharding 横向扩容&#xff0c;Persistence 宕机可恢复&#xff0c;Strea…

[激光原理与应用-250]:理论 - 几何光学 - 透镜成像的优缺点,以及如克服缺点

透镜成像是光学系统中应用最广泛的技术&#xff0c;其通过折射原理将物体信息转换为图像&#xff0c;但存在像差、环境敏感等固有缺陷。以下是透镜成像的优缺点及针对性改进方案&#xff1a;一、透镜成像的核心优点高效集光能力透镜通过曲面设计将分散光线聚焦到一点&#xff0…

测试匠谈 | AI语音合成之大模型性能优化实践

「测试匠谈」是优测云服务平台倾心打造的内容专栏&#xff0c;汇集腾讯各大产品的顶尖技术大咖&#xff0c;为大家倾囊相授开发测试领域的知识技能与实践&#xff0c;让测试工作变得更加轻松高效。 本期嘉宾介绍 Soren&#xff0c;腾讯TEG技术事业群质量工程师&#xff0c;负责…

用天气预测理解分类算法-从出门看天气到逻辑回归

一、生活中的决策难题&#xff1a;周末郊游的「天气判断」 周末计划郊游时&#xff0c;你是不是总会打开天气预报反复确认&#xff1f;看到 "25℃、微风、无雨" 就兴奋收拾行李&#xff0c;看到 "35℃、暴雨" 就果断取消计划。这个判断过程&#xff0c;其…

HTTPS服务

HTTPS服务 一、常见的端口 http ------ 80 明文 https ------ 443 数据加密 dns ------ 53 ssh ------ 22 telent ------ 23 HTTPS http ssl或者tls &#xff08;安全模式&#xff09; 二、原理&#xff1a; c&#xff08;客户端…

【Android笔记】Android 自定义 TextView 实现垂直渐变字体颜色(支持 XML 配置)

Android 自定义 TextView 实现垂直渐变字体颜色&#xff08;支持 XML 配置&#xff09; 在 Android UI 设计中&#xff0c;字体颜色的渐变效果能让界面看起来更加精致与现代。常见的渐变有从左到右、从上到下等方向&#xff0c;但 Android 的 TextView 默认并不支持垂直渐变。…

CANopen Magic调试软件使用

一、软件安装与硬件连接1.1 系统要求操作系统&#xff1a;Windows 7/10/11 (64位)硬件接口&#xff1a;支持Vector/PEAK/IXXAT等主流CAN卡推荐配置&#xff1a;4GB内存&#xff0c;2GHz以上CPU1.2 安装步骤运行安装包CANopen_Magic_Setup.exe选择安装组件&#xff08;默认全选&…

前端css学习笔记3:伪类选择器与伪元素选择器

本文为个人学习总结&#xff0c;如有谬误欢迎指正。前端知识众多&#xff0c;后续将继续记录其他知识点&#xff01; 目录 前言 一、伪类选择器 1.概念 2.动态选择器&#xff08;用户交互&#xff09; 3.结构伪类 &#xff1a;first-child&#xff1a;选择所有兄弟元素的…

深入探索 PDF 数据提取:PyMuPDF 与 pdfplumber 的对比与实战

在数据处理和分析领域&#xff0c;PDF 文件常常包含丰富的文本、表格和图形信息。然而&#xff0c;从 PDF 中提取这些数据并非易事&#xff0c;尤其是当需要保留格式和颜色信息时。幸运的是&#xff0c;Python 社区提供了多个强大的库来帮助我们完成这项任务&#xff0c;其中最…

Springboot注册过滤器的三种方式(Order 排序)

一、使用 Component Order&#xff08;简单但不够灵活&#xff09; 适用于全局过滤器&#xff0c;无需手动注册&#xff0c;Spring Boot 会自动扫描并注册。 Component Order(1) // 数字越小&#xff0c;优先级越高 public class AuthFilter implements Filter {Autowired /…

电脑硬件详解

前几天我的风扇转的很快&#xff0c;而且cpu占用率很高&#xff0c;然后我在想怎么回事&#xff0c;然后就浅浅研究了一下电脑的硬件。 笔记本主板&#xff1a; 台式机主板&#xff1a; 图1&#xff1a; 图2&#xff1a; 电脑硬件详解 电脑的硬件是组成计算机系统的物理设…

力扣47:全排列Ⅱ

力扣47:全排列Ⅱ题目思路代码题目 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 思路 又是任意顺序和所有不重复的排列&#xff0c;显而易见我们要使用回溯的办法。 首先是回溯的结束条件即新数组的长度等于nums的长度。这道题的难点…

学习笔记091——如何实现web登录时,密码复杂度校验?(后端)

1、创建工具类 /*** 密码复杂度校验* param password 密码*/ public static void validatePassword(String password) {// 至少8位if (password.length() < 8) {throw new IllegalArgumentException("密码长度至少为8位");}// 包含大小写字母if (!password.matche…

雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论

一、前言在日趋复杂的分布式系统中&#xff0c;数据量越来越大&#xff0c;数据库分库分表是一贯的垂直水平做法&#xff0c;但是需要一个全局唯一ID标识一条数据或者MQ消息&#xff0c;数据库id自增就显然不能满足要求了。因为场景不同&#xff0c;分布式ID需要满足以下几个条…

【PCB设计经验】去耦电容如何布局?

0805 和 0603 以及更小 封装的电容用作于对中高频的去耦,其摆放位置是有要求的: 一、建议尽可能的靠近主控芯片的 电源管脚放置。 二、使用较宽和短的引线连接到电源和地过孔可以采用如下 图 4–1 中的图 ( 2 )、( 3)、 ( 4 )任意一种方式,避免使用长线或者较细的…

自动化运维实验

目录 一、实验拓扑 二、实验目的 三、实验步骤 实验思路&#xff1a; 代码部分&#xff1a; 四、实验结果&#xff1a; 一、实验拓扑 二、实验目的 利用python脚本&#xff0c;在本地&#xff0c;或者虚拟机里实现&#xff0c;设备CRC数量统计&#xff0c;并输出成表格 三、实验…

Wed前端第二次作业

一、作业1&#xff1a;完成自己学校的官网&#xff0c;动忘内容直接贴&#xff0c;至少三个不同的页面1、界面1&#xff08;1&#xff09;相关代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…