【跨服務器的數據自動化下載--安裝公鑰,免密下載】

跨服務器的數據自動化下載

    • 功能介紹:
    • 上代碼:

發現好久沒寫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…