容災備份 | 看我使用Powershell操作FTP進行數據文件自動上傳備份
設為「?? 星標」帶你從基礎入門 到 全棧實踐 再到 放棄學習!
涉及 網絡安全運維、應用開發、物聯網IOT、學習路徑 、個人感悟 等知識分享。
希望各位看友多多支持【關注、點贊、評論、收藏、投幣】,助力每一個夢想。
【WeiyiGeek Blog's - 花開堪折直須折,莫待無花空折枝 】
作者主頁: 【 https://weiyigeek.top 】
博客地址: 【 https://blog.weiyigeek.top 】
作者答疑學習交流群:歡迎各位志同道合的朋友一起學習交流【點擊 ?? 加入交流群】, 或者關注公眾號回復【學習交流群】。
0x00 前言簡述
描述: 在運維過程中會將服務器上數據文件備份在共享磁盤或者FTP服務器中,此處由于作者環境是在Windows系統上,且在業務上需要同步文件到FTP服務器中,遂有了此文,幫助各位看友了解,如何在Windows上使用Powershell腳本將數據備份文件自動上傳的FTP服務器上?
在下述實踐中,我們可以使用三種方式進行數據文件上傳到FTP服務器中。
- 方式1.使用Powershell與Windows原生ftp客戶端工具(僅僅支持主動模式)進行文件備份.
- 方式2.使用Powershell中.NET的內置的FTP操作類
System.Net.FtpWebRequest連接ftp服務器并進行備份文件上傳. - 方式3.使用Powershell的PSFTP模塊包連接ftp服務器并進行備份文件上傳。
項目地址(歡迎大家 star ,蟹蟹?('ω')?支持 ): https://github.com/WeiyiGeek/SecOpsDev/
下述實驗室需要部署FTP服務器,若不了解的童鞋,可參考博主的FTP入門掃盲篇《FTP遠程文件傳輸服務安裝與配置》,文章地址: https://blog.weiyigeek.top/2019/10-4-74.html
或者參考此《使用Kubernetes容器快速部署常用服務》( https://blog.weiyigeek.top/2022/2-25-668.html )文章快速使用 kubernetes 安裝 vsftpd 服務,搭建ftp測試環境。
廢話不多說,實踐為王!
首發鏈接: https://mp.weixin.qq.com/s/YuaqncfbOsC3-wjCdikfBw
0x01 實踐演示
實踐1.使用Powershell與Windows原生ftp客戶端工具(僅僅支持主動模式)進行文件備份.
代碼示例:

溫馨提示: 為了保障腳本中FTP密碼的安全性,我將腳本中高敏感的賬號密碼進行編碼存儲(只能防君子,不能防小人??)。
# 編碼
$bytes = [System.Text.Encoding]::Unicode.GetBytes("weiyigeek")
$str = [System.Convert]::ToBase64String($bytes)
echo $str
# 解碼
$str = "VwBlAGkAeQBpAEcAZQBlAGsAZQByAA=="
[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($str))
[System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($str)) | Out-File -Encoding "ASCII" plaintext.html
溫馨提示: 獲取上述示例代碼或者腳本地址失效,請在【全棧工程師修煉指南】公眾號回復 PowerShell-FTP 或者 10000 獲取最新PowerShell的FTP同步腳本地址。
全棧工程師修煉指南: https://weiyigeek.top/wechat.html?key=10000
注意提示: 在中文Windows下執行腳本默認為GBK,若是亂碼請轉為GBK或者其他編碼模式。
實踐2.使用Powershell中.NET的內置的FTP操作類 System.Net.FtpWebRequest 連接ftp服務器并進行備份文件上傳.
描述: 在實踐1中的方式由于windows自帶的ftp客戶端只支持(主動模式),對于FTP被動模式是沒有辦法的,此時我們可以采用如下方式進行被動模式下上傳文件到FTP空間之中。
代碼示例:

執行結果:

溫馨提示: 獲取上述示例代碼或者腳本地址失效,請在【全棧工程師修煉指南】公眾號回復 PowerShell-FTP 或者 10000 獲取最新PowerShell的FTP同步腳本地址。
全棧工程師修煉指南: https://weiyigeek.top/wechat.html?key=10000
注意提示: 在中文Windows下執行腳本默認為GBK,若是亂碼請轉為GBK或者其他編碼模式。
為了實現腳本的自動執行,我們可以將其配置到計算機任務計劃中,進行定時執行,操作流程如下:
步驟 01.在開始->運行 命令行執行 taskschd.msc 命令 或者 打開任務計劃程序。
步驟 02.新建任務計劃,創建基本任務,設置觸發實踐以及觸發操作,如下圖所示

實踐3.使用Powershell的PSFTP模塊包連接ftp服務器并進行備份文件上傳。
描述: 通過上面實踐我們了解到PowerShell本身并沒了內置對FTP的支持,但是.net里面內置了FTP操作的類,但是確實自己來組合封裝幾個FTP操作類是不是比較費時。
此時我只想偷懶,我去PowerShell Gallery里面搜尋一番后( https://www.powershellgallery.com ),發現已經有人幫我造好輪子了即 PSFTP 模塊包,既然這樣那就不客氣了,拿來開箱即用!
在使用前我們需要安裝 PSFTP 模塊包,模塊當前版本為 1.7.1.1,其作用是管理FTP帳戶的功能。
模塊地址: https://www.powershellgallery.com/packages/PSFTP/1.7.1.1
安裝:
官網提供了三種安裝方式,即在線命令安裝、Azure云安裝以及手動下載安裝。
# 在線: 復制并粘貼以下命令以使用PowerShellGet更多信息安裝此程序包。(可能受到環境影響,推薦)
PS> Install-Module -Name PSFTP
# 需要使用 NuGet 提供程序來繼續操作
# PowerShellGet 需要使用 NuGet 提供程序“2.8.5.201”或更高版本來與基于 NuGet 的存儲庫交互。必須在“C:\Program
# Files\PackageManagement\ProviderAssemblies”或“C:\Users\WeiyiGeek\AppData\Local\PackageManagement\ProviderAssemblies”
# 中提供 NuGet 提供程序。也可以通過運行 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force' 安裝 NuGet
# 提供程序。是否要讓 PowerShellGet 立即安裝并導入 NuGet 提供程序?
[Y] 是(Y) [N] 否(N) [S] 暫停(S) [?] 幫助 (默認值為“Y”): Y
# 手動: 手動將.nupkg文件下載到系統的默認下載位置。(需要配置較多)
# https://psg-prod-eastus.azureedge.net/packages/psftp.1.7.1.1.nupkg
PS> Install-Package psftp.1.7.1.1.nupkg
驗證
# 安裝PSFTP包之后我們使用如下命令查看是否已經安裝成功
PS> Get-Module PSFTP -ListAvailable
# 目錄: C:\Program Files\WindowsPowerShell\Modules
# ModuleType Version Name ExportedCommands
# ---------- ------- ---- ----------------
# Manifest 1.7.1.1 PSFTP {Add-FTPItem, Get-FTPChildItem, Get-FTPConnection, Get-FTPItem...}
# 查看PSFTP工具里面都支持那些操作
PS> Get-Command -FullyQualifiedModule PSFTP
CommandType Name Version Source
----------- ---- ------- ------
Alias Move-FTPItem 1.7.1.1 PSFTP
Alias Receive-FTPItem 1.7.1.1 PSFTP
Alias Send-FTPItem 1.7.1.1 PSFTP
Function Add-FTPItem 1.7.1.1 PSFTP
Function Get-FTPChildItem 1.7.1.1 PSFTP
Function Get-FTPConnection 1.7.1.1 PSFTP
Function Get-FTPItem 1.7.1.1 PSFTP
Function Get-FTPItemSize 1.7.1.1 PSFTP
Function New-FTPItem 1.7.1.1 PSFTP
Function Remove-FTPItem 1.7.1.1 PSFTP
Function Rename-FTPItem 1.7.1.1 PSFTP
Function Set-FTPConnection 1.7.1.1 PSFTP
Function Test-FTPItem 1.7.1.1 PSFTP
# 查看幫助命令
PS> Get-Help Set-FTPConnection -Examples
命令行實踐
描述: 此處我按照文章首部的地址,進行安裝了ftp測試環境,其FTP鏈接環境信息如下:
IP: 10.20.176.215
Port: 30021
User: weiyigeek
Pass: password
首先,利用Windows中原生的ftp客戶端工具鏈接測試(PS: 如果是使用Linux登錄就不存在問題):
PS L:\WeiyiGeek> ftp
ftp> open 10.20.176.215 30021
連接到 10.20.176.215。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用戶(10.20.176.215:(none)): weiyigeek
331 Please specify the password.
密碼:
230 Login successful.
ftp> dir
500 Illegal PORT command.
425 Use PORT or PASV first. # 可看到不支持被動模式。
然后,我們手動使用PSFTP模塊進行被動鏈接測試:
# 配置 PowerShell 執行策略導入安裝的PSFTP模塊
Set-executionpolicy remotesigned
Import-Module PSFTP
# ftp 認證票據生成
$FTPConnect = "ftp://10.20.176.215:30021" # FTP 服務器鏈接字符串
$FTPUser = "weiyigeek"
$FTPPass = ConvertTo-SecureString -String "password" -AsPlainText -Force
$FTPCre = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $FTPUser, $FTPPass
# 連接到 ftp 服務器鏈接 (被動鏈接)
Set-FTPConnection -Credentials $FTPCre -Server $FTPConnect -UsePassive
# 執行結果:
# ContentLength : -1
# Headers : {}
# SupportsHeaders : True
# ResponseUri : ftp://10.20.176.215:30021/
# StatusCode : ClosingData
# StatusDescription : 226 Directory send OK.
# LastModified : 0001/1/1 0:00:00
# BannerMessage : 220 (vsFTPd 3.0.2)
# WelcomeMessage : 230 Login successful.
# ExitMessage : 221 Goodbye.
# IsFromCache : False
# IsMutuallyAuthenticated : False
# ContentType :
最后,我們使用PSFTP進行文件管理:
# 1.添加/上傳文件 - Add-FTPItem (Send-FTPItem)
Send-FTPItem -LocalPath .\console.log
Send-FTPItem -LocalPath .\weiyigeek.txt -Overwrite
# 2.新建目錄 - New-FTPItem
New-FTPItem -Name weiyigeek
# - 指定目錄創建子目錄
New-FTPItem -Name subdir -Path $FTPConnect/weiyigeek
# 257 "/weiyigeek/subdir" created
# 3.獲取目錄下面的文件、子目錄 - Get-FTPChildItem
Get-FTPChildItem
# Parent:ftp://10.20.176.215:30021
# Dir Right Ln User Group Size ModifiedDate Name
# --- ----- -- ---- ----- ---- ------------ ----
# d rwx------ 2 ftp ftp 2023/3/7 11:17:00 weiygeek
# - rw------- 1 ftp ftp 18KB 2023/3/7 11:11:00 console.log
# - rw------- 1 ftp ftp 2KB 2023/3/7 11:12:00 ls.txt
Get-FTPChildItem -Path subdir # 指定目錄
Get-FTPChildItem -Recurs -Depth 1 # 遞歸返回所有信息
# 4.下載文件 - Get-FTPItem(Receive-FTPItem)
# - 下載image.png到當前目錄
Get-FTPItem weiyigeek.png
# - 下載image.png到指定目錄
Get-FTPItem weiyigeek.png -LocalPath D:\download
# - 下載image.png到指定目錄,如果指定目錄不存在自動創建
Get-FTPItem weiyigeek.png -LocalPath D:\download\1\2\3\4\5 -RecreateFolders
# 5.獲取文件大小 - Get-FTPItemSize
(Get-FTPItemSize console.log)/1000
18.781
# 6.刪除文件 - Remove-FTPItem
Remove-FTPItem .\ls.txt
# ->Remove File: ftp://10.20.176.215:30021/.\ls.txt
# 250 Delete operation successful.
# 7.重命名文件或者目錄 - Rename-FTPItem(Move-FTPItem)
Rename-FTPItem -Path .\console.log -NewName weiyigeek.top.log
# 250 Rename successful.
是不是,感覺比實踐2中.net實現方便多了,所以用起來是真的舒服,實際上它是將.net中的方法進行了封裝。
項目實踐:

執行結果:
PS D:\Tools> .\DB-Backup-To-FTP-Use-PSFTP-Package.ps1
[03/08/2023 09:09:08] 當前數據庫備份文件 qchatgpt.legacy.log ,寫入 ./upload.txt 文件中!
[03/08/2023 09:09:08] 當前數據庫備份文件 qchatgpt.legacy.log , 上次數據庫備份文件 logs 名稱, 上傳標識 1 .
230 Login successful.
Parent:ftp://10.20.176.215:30021/weiyigeek/qchatgpt.legacy.log
Dir Right Ln User Group Size ModifiedDate Name
--- ----- -- ---- ----- ---- ------------ ----
- rw------- 1 ftp ftp 34KB 2023/3/8 1:09:00 qchatgpt.legacy.log
[03/08/2023 09:09:08] Upload Status:
Upload File /weiyigeek/qchatgpt.legacy.log successful!

溫馨提示: 獲取上述示例代碼或者腳本地址失效,請在【全棧工程師修煉指南】公眾號回復 PowerShell-FTP 或者 10000 獲取最新PowerShell的FTP同步腳本地址。
全棧工程師修煉指南: https://weiyigeek.top/wechat.html?key=10000
注意提示: 在中文Windows下執行腳本默認為GBK,若是亂碼請轉為GBK或者其他編碼模式。
本文介紹了PowerShell操作FTP的方法,以及使用.net 提供的類來訪問FTP。
好了,本章到此介紹,感興趣的朋友請繼續研究吧!
原文地址: https://blog.weiyigeek.top/2023/3-7-720.html
本文至此完畢,更多技術文章,盡情期待下一章節!
溫馨提示:唯一極客技術博客文章在線瀏覽【極客全棧修煉】小程序上線了,涉及網絡安全、系統運維、應用開發、物聯網實戰、全棧文章,希望和大家一起學習進步,歡迎瀏覽交流!(希望大家多多提提意見)
專欄書寫不易,如果您覺得這個專欄還不錯的,請給這篇專欄 【點個贊、投個幣、收個藏、關個注,轉個發,留個言】(人間六大情),這將對我的肯定,謝謝!。

溫馨提示: 由于作者水平有限,本章錯漏缺點在所難免,希望讀者批評指正,并請在文章末尾留下您寶貴的經驗知識,聯系郵箱地址 master@weiyigeek.top 或者關注公眾號 WeiyiGeek 聯系我。
本文來自博客園,作者:全棧工程師修煉指南,轉載請注明原文鏈接:http://www.rzrgm.cn/WeiyiGeek/p/17192094.html。
歡迎關注博主【WeiyiGeek】公眾號以及【極客全棧修煉】小程序

在運維過程中會將服務器上數據文件備份在共享磁盤或者FTP服務器中,此處由于作者環境是在Windows系統上,且在業務上需要同步文件到FTP服務器中,遂有了此文,幫助各位看友了解,如何在Windows上使用Powershell腳本將數據備份文件自動上傳的FTP服務器上?
浙公網安備 33010602011771號