使用PowerShell将文件上载到SFTP
我们被要求设置从一台服务器到SFTP站点的自动上传。每周一早上会有一个文件从数据库导出到文件管理器,他们希望该文件在周二上传到SFTP。我们目前使用的身份验证方法是用户名和密码(我相信也有一个选择,可以使用密钥文件,但选择了用户名/密码选项) 我设想的方式是,在服务器上安装一个脚本,Windows任务调度器将触发该脚本在特定时间(星期二)运行,该脚本将捕获相关文件并将其上载到SFTP,然后将其移动到其他位置以进行备份 例如:使用PowerShell将文件上载到SFTP,powershell,automation,upload,sftp,winscp,Powershell,Automation,Upload,Sftp,Winscp,我们被要求设置从一台服务器到SFTP站点的自动上传。每周一早上会有一个文件从数据库导出到文件管理器,他们希望该文件在周二上传到SFTP。我们目前使用的身份验证方法是用户名和密码(我相信也有一个选择,可以使用密钥文件,但选择了用户名/密码选项) 我设想的方式是,在服务器上安装一个脚本,Windows任务调度器将触发该脚本在特定时间(星期二)运行,该脚本将捕获相关文件并将其上载到SFTP,然后将其移动到其他位置以进行备份 例如: 本地目录:C:\FileDump SFTP目录:/Outbox/ 备
- 本地目录:
C:\FileDump
- SFTP目录:
/Outbox/
- 备份目录:
C:\Backup
当我运行
Get Host
时,我的控制台主机版本是4.0
谢谢。目前没有用于执行SFTP部分的内置PowerShell方法。您必须使用类似于psftp.exe的东西或类似于Posh SSH的PowerShell模块 下面是一个示例,使用: 一些补充说明:
- 您必须下载Posh SSH模块,将其安装到您的用户模块目录(例如C:\Users\jon\u dechiro\Documents\WindowsPowerShell\Modules)中,然后使用该名称加载,或者将其放在任何位置,然后像上面代码中那样加载
- 如果脚本中的凭据不可接受,则必须使用凭据文件。如果你需要帮助,我可以更新一些细节或指向你的一些链接
- 根据需要更改路径、IP等
$env:path
目录中有):
您没有告诉我们WinSCP有什么特殊问题,所以我只能重复WinSCP文档中的内容
- .
目前最新的软件包是WinSCP-5.19-Automation.zip
随脚本归档.zip
- 使用这样的代码(基于官方):
您可以让WinSCP为您的上载生成PowerShell脚本:
- 使用WinSCP GUI登录到您的服务器李>
- 导航到远程文件面板中的目标目录李>
- 在本地文件面板中选择要上传的文件李>
- 调用Upload命令李>
- 在上,转到传输设置>生成代码李>
- 在“生成传输代码”对话框中,选择李>
- 选择PowerShell语言
(我是WinSCP的作者)我能够使用PowerShell进行sftp,如下所示:
PS C:\Users\user\Desktop>sftpuser@aa.bb.cc.dd
user@aa.bb.cc.dd的密码:
连接到user@aa.bb.cc.dd.
sftp>ls
测试文件夹
sftp>cd测试文件夹
sftp>ls
泰姬陵.jpeg
sftp>put taj_mahal_1.jpeg
正在将taj_mahal_1.jpeg上载到/home/user/testFolder/taj_mahal_1.jpeg
泰姬陵1.jpeg 100%11KB 35.6KB/s 00:00
sftp>ls
泰姬陵.jpeg泰姬陵1.jpeg
sftp>
我没有安装Posh SSH或类似的东西。我正在使用Windows 10 Pro PowerShell。没有安装其他模块。好吧,在使用powershell 7时,我们只需使用以下命令使用sftp上传文件即可
echo "put localpath/file.txt destinationpath/file.txt" | sftp username@server
请务必添加这些双引号。我昨天在试图解决这些问题时遇到了问题。然后我找到了你的帖子。这帮了大忙!我在几分钟内就完成了测试,看起来一切都会顺利进行。这是一个非常漂亮的功能,先生。有时,您需要的只是一个很好的示例。如果我能确保我的机器上没有安装自定义PowerShell模块,我希望这可能是一个很好的答案:D。只是我无法将Get Module的响应放在PowerShell中。它说评论太长…在回答中添加了Powershell模块列表。您最可能使用的是
sftp
命令行客户端,它内置于最新版本的Windows 10中–因此与Powershell本身无关。如果您想让这成为一个真正有用的回答,您应该发布一个示例,如何在真正的自动脚本中使用sftp
,而不是以交互方式。如果不想使用其他模块,这很好。但这并不是针对PowerShell优化的。它甚至没有路径建议这样的简单功能。只是一个简单的客户端,内置在更新版本的Windows 10中。为什么是PowerShell 7?这应该适用于任何版本的PowerShell这并不能解决身份验证问题。我认为实际上可以这样做,如果您先安装一些密钥而不使用密码短语。然后身份验证将使用密钥文件而不是密码。请参阅ssh-keygen和ssh-agent的文档。确保不要为密钥输入密码短语(因为每次都必须输入密码而不是密码-与密码问题相同)。@MartinPrikryl yeah它适用于所有版本的powershell。我提到Powershell 7是因为我在使用PS7。对于自动认证,可以使用Michael W.提到的方法。
pscp -sftp -pw passwd c:\filedump\* user@host:/Outbox/
mv c:\filedump\* c:\backup\*
# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "example.com"
UserName = "user"
Password = "mypassword"
SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...="
}
$session = New-Object WinSCP.Session
try
{
# Connect
$session.Open($sessionOptions)
# Upload
$session.PutFiles("C:\FileDump\export.txt", "/Outbox/").Check()
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
echo "put localpath/file.txt destinationpath/file.txt" | sftp username@server