[TOC]
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.top-使用Powershell与Windows原生ftp客户端备份图
温馨提示: 为了保障脚本中FTP密码的安全性,我将脚本中高敏感的账号密码进行编码存储(只能防君子,不能防小人😃)。
[TOC]
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.top-使用Powershell与Windows原生ftp客户端备份图
温馨提示: 为了保障脚本中FTP密码的安全性,我将脚本中高敏感的账号密码进行编码存储(只能防君子,不能防小人😃)。1 2 3 4 5 6 7 8 9 $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.top-在PS中使用.NET的内置的FTP操作类图
执行结果:
weiyigeek.top-上传到FTP服务器中的备份文件图
脚本片段补充:1 2 3 4 5 6 $Current_db_names = (get-childitem $LocationBackupDir | sort CreationTime -Descending | Select-Object).name foreach ($db_names in $Current_db_names ) { Upload -file_name $Current_db_name -ftp_user $(Convert("$FTPUser " )) -ftp_pass $(Convert("$FTPPass " )) }
温馨提示: 获取上述示例代码或者脚本地址失效,请在【全栈工程师修炼指南
】公众号回复 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云安装以及手动下载安装。1 2 3 4 5 6 7 8 9 10 11 12 PS> Install-Module -Name PSFTP [Y] 是(Y) [N] 否(N) [S] 暂停(S) [?] 帮助 (默认值为“Y”): Y PS> Install-Package psftp.1.7.1.1.nupkg
验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 PS> Get-Module PSFTP -ListAvailable 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登录就不存在问题):1 2 3 4 5 6 7 8 9 10 11 12 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模块进行被动链接测试:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Set-executionpolicy remotesignedImport-Module PSFTP$FTPConnect = "ftp://10.20.176.215:30021" $FTPUser = "weiyigeek" $FTPPass = ConvertTo-SecureString -String "password" -AsPlainText -Force$FTPCre = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $FTPUser , $FTPPass Set-FTPConnection -Credentials $FTPCre -Server $FTPConnect -UsePassive
最后,我们使用PSFTP进行文件管理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 Send-FTPItem -LocalPath .\console.log Send-FTPItem -LocalPath .\weiyigeek.txt -Overwrite New-FTPItem -Name weiyigeek New-FTPItem -Name subdir -Path $FTPConnect /weiyigeek Get-FTPChildItem Get-FTPChildItem -Path subdir Get-FTPChildItem -Recurs -Depth 1 Get-FTPItem weiyigeek.png Get-FTPItem weiyigeek.png -LocalPath D:\download Get-FTPItem weiyigeek.png -LocalPath D:\download\1\2\3\4\5 -RecreateFolders (Get-FTPItemSize console.log)/1000 18.781 Remove-FTPItem .\ls.txt Rename-FTPItem -Path .\console.log -NewName weiyigeek.top.log
是不是,感觉比实践2中.net实现方便多了,所以用起来是真的舒服,实际上它是将.net中的方法进行了封装。
项目实践:
weiyigeek.top-PSFTP模块实践自动上传备份文件代码图
执行结果: 1 2 3 4 5 6 7 8 9 10 11 12 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.top-使用PSFTP模块实践图
温馨提示: 获取上述示例代码或者脚本地址失效,请在【全栈工程师修炼指南
】公众号回复 PowerShell-FTP 或者 10000
获取最新PowerShell的FTP同步脚本地址。 全栈工程师修炼指南: https://weiyigeek.top/wechat.html?key=10000 注意提示: 在中文Windows下执行脚本默认为GBK,若是乱码请转为GBK或者其他编码模式。
本文介绍了PowerShell操作FTP的方法,以及使用.net 提供的类来访问FTP。
好了,本章到此介绍,感兴趣的朋友请继续研究吧!