欢迎关注「全栈工程师修炼指南」公众号
点击 👇 下方卡片 即可关注我哟!
设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习!
涉及 企业运维、网络安全、应用开发、物联网、人工智能、大数据 学习知识
“ 花开堪折直须折,莫待无花空折枝。 ”
作者主页:[ https://www.weiyigeek.top ]
作者博客:[ https://blog.weiyigeek.top ]
作者答疑学习交流群:请关注公众号后回复【学习交流群】
文章目录:
-
0x00 前言简述
-
0x01 实践演示
-
实践1.使用Powershell与Windows原生ftp客户端工具(仅仅支持主动模式)进行文件备份.
-
实践2.使用Powershell中.NET的内置的FTP操作类 System.Net.FtpWebRequest
连接ftp服务器并进行备份文件上传.
-
实践3.使用Powershell的PSFTP模块包连接ftp服务器并进行备份文件上传。
温馨提示: 由于作者水平有限,本章错漏缺点在所难免,希望读者批评指正,若有问题或建议请在文章末尾留下您宝贵的经验知识,或联系邮箱地址
master@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测试环境。
废话不多说,实践为王!
0x01 实践演示
实践1.使用Powershell与Windows原生ftp客户端工具(仅仅支持主动模式)进行文件备份.
代码示例:
![d963beb03faeb4131c2007b04532179e.png](https://img-blog.csdnimg.cn/img_convert/d963beb03faeb4131c2007b04532179e.png)
温馨提示: 为了保障脚本中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空间之中。
代码示例:
![cc95f02309a75942d2e83966eff7b512.png](https://img-blog.csdnimg.cn/img_convert/cc95f02309a75942d2e83966eff7b512.png)
执行结果:
![f9751d3628cefa561d5b7fdd593fcae3.png](https://img-blog.csdnimg.cn/img_convert/f9751d3628cefa561d5b7fdd593fcae3.png)
温馨提示: 获取上述示例代码或者脚本地址失效,请在【全栈工程师修炼指南
】公众号回复 PowerShell-FTP 或者 10000
获取最新PowerShell的FTP同步脚本地址。
全栈工程师修炼指南: https://weiyigeek.top/wechat.html?key=10000
注意提示: 在中文Windows下执行脚本默认为GBK,若是乱码请转为GBK或者其他编码模式。
为了实现脚本的自动执行,我们可以将其配置到计算机任务计划中,进行定时执行,操作流程如下:
步骤 01.在开始->运行 命令行执行 taskschd.msc 命令 或者 打开任务计划程序。
步骤 02.新建任务计划,创建基本任务,设置触发实践以及触发操作,如下图所示
![6832f530a44c8179fdee43ce6bc95628.png](https://img-blog.csdnimg.cn/img_convert/6832f530a44c8179fdee43ce6bc95628.png)
偷偷的告诉你哟?【极客全栈修炼】微信小程序已经上线了,
可直接在微信里面直接浏览博主博客了哟,后续将上线更多有趣的小工具。
实践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中的方法进行了封装。
亲,文章就要看完了,不关注一下作者吗?
![935ebe7c11ab17e1dd7977150a1bf0ac.jpeg](https://img-blog.csdnimg.cn/img_convert/935ebe7c11ab17e1dd7977150a1bf0ac.jpeg)
项目实践:
![8a3d643288a40e17d8f16b17ac7d244d.png](https://img-blog.csdnimg.cn/img_convert/8a3d643288a40e17d8f16b17ac7d244d.png)
执行结果:
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!
![c8df96968b0689a09499ef9fac873366.png](https://img-blog.csdnimg.cn/img_convert/c8df96968b0689a09499ef9fac873366.png)
温馨提示: 获取上述示例代码或者脚本地址失效,请在【全栈工程师修炼指南
】公众号回复 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
本文至此完毕,更多技术文章,尽情等待下篇好文!
学习书籍推荐 往期发布文章 ![d765b42cac8218f3492e9dd465bb7ef4.png](https://img-blog.csdnimg.cn/img_convert/d765b42cac8218f3492e9dd465bb7ef4.png)
全栈之路-前端篇 | 第一讲.基础前置知识【浏览器内核与网络知识】学习笔记
全栈之路-前端篇 | 第二讲.基础前置知识【应用服务端与编程语言】学习笔记
全栈之路-前端篇 | 第三讲.基础前置知识【前端标准与研发工具】学习笔记
持续集成案例之使用Docker运行自构建Jenkins的Agent镜像固定工作节点实践(分享企业项目流水线代码)
记一次由于外部K8S集群证书到期导致Jenkins无法生成动态agent节点错误解决(入坑出坑)
运维案例之记一次Kubernetes集群证书过期或延期操作处理实践指南(干货分享)
长按(扫描)二维码 获取更多渠道哟!
![0015857ed285d9450377d01fff453893.jpeg](https://img-blog.csdnimg.cn/img_convert/0015857ed285d9450377d01fff453893.jpeg)
如果此篇文章对你有帮助,请你将它分享给更多的人!
点击【"阅读原文"】获取更多有趣的知识!