容災備份 | 看我使用Powershell操作FTP進行資料檔案自動上傳備份

WeiyiGeek發表於2023-03-08
[ 點選 ? 關注「 全棧工程師修煉指南」公眾號 ]

設為「⭐️ 星標」帶你從基礎入門全棧實踐 再到 放棄學習
涉及 網路安全運維、應用開發、物聯網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客戶端工具(僅僅支援主動模式)進行檔案備份.

程式碼示例:
WeiyiGeek.使用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空間之中。

程式碼示例:
WeiyiGeek.在PS中使用.NET的內建的FTP操作類圖

執行結果:
WeiyiGeek.上傳到FTP伺服器中的備份檔案圖


溫馨提示: 獲取上述示例程式碼或者指令碼地址失效,請在【全棧工程師修煉指南】公眾號回覆 PowerShell-FTP 或者 10000 獲取最新PowerShell的FTP同步指令碼地址。
全棧工程師修煉指南: https://weiyigeek.top/wechat.html?key=10000
注意提示: 在中文Windows下執行指令碼預設為GBK,若是亂碼請轉為GBK或者其他編碼模式。


為了實現指令碼的自動執行,我們可以將其配置到計算機任務計劃中,進行定時執行,操作流程如下:

步驟 01.在開始->執行 命令列執行 taskschd.msc 命令 或者 開啟任務計劃程式。

步驟 02.新建任務計劃,建立基本任務,設定觸發實踐以及觸發操作,如下圖所示

WeiyiGeek.Windows下的定時任務圖


實踐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中的方法進行了封裝。


專案實踐:
WeiyiGeek.PSFTP模組實踐自動上傳備份檔案程式碼圖

執行結果:

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!

WeiyiGeek.使用PSFTP模組實踐圖


溫馨提示: 獲取上述示例程式碼或者指令碼地址失效,請在【全棧工程師修煉指南】公眾號回覆 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 聯絡我。

相關文章