• 容灾备份 | 看我使用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客户端工具(仅仅支持主动模式)进行文件备份.

    代码示例:
    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 联系我。

  • 相关阅读:
    Vue30 自定义指令 函数式 对象式
    移动端页面如何优雅的适配各种屏幕,包括PC端
    2022杭电多校9 Matryoshka Doll
    golang——工程组件logrus日志记录框架(结构化记录,支持文件切割,hook)
    (22)STM32——RTC时钟笔记(基于正点原子探索者)
    python中的字典对象
    java基于springboot的学生公寓管理系统
    P1101 单词方阵——dfs
    与5G一起过中秋,天涯变咫尺
    泛型的继承、通配和练习
  • 原文地址:https://www.cnblogs.com/WeiyiGeek/p/17192094.html