使用PowerShell将文件上载到SFTP

使用PowerShell将文件上载到SFTP,powershell,automation,upload,sftp,winscp,Powershell,Automation,Upload,Sftp,Winscp,我们被要求设置从一台服务器到SFTP站点的自动上传。每周一早上会有一个文件从数据库导出到文件管理器,他们希望该文件在周二上传到SFTP。我们目前使用的身份验证方法是用户名和密码(我相信也有一个选择,可以使用密钥文件,但选择了用户名/密码选项) 我设想的方式是,在服务器上安装一个脚本,Windows任务调度器将触发该脚本在特定时间(星期二)运行,该脚本将捕获相关文件并将其上载到SFTP,然后将其移动到其他位置以进行备份 例如: 本地目录:C:\FileDump SFTP目录:/Outbox/ 备

我们被要求设置从一台服务器到SFTP站点的自动上传。每周一早上会有一个文件从数据库导出到文件管理器,他们希望该文件在周二上传到SFTP。我们目前使用的身份验证方法是用户名和密码(我相信也有一个选择,可以使用密钥文件,但选择了用户名/密码选项)

我设想的方式是,在服务器上安装一个脚本,Windows任务调度器将触发该脚本在特定时间(星期二)运行,该脚本将捕获相关文件并将其上载到SFTP,然后将其移动到其他位置以进行备份

例如:

  • 本地目录:
    C:\FileDump

  • SFTP目录:
    /Outbox/

  • 备份目录:
    C:\Backup

在这一点上,我尝试了一些东西,WinSCP也是其中之一,但到目前为止,没有任何东西对我有效

这将在Windows Server 2012R2上运行。
当我运行
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