我正在尝试在 SQL Server 代理作业中使用 Powershell 来下载 zip 文件。该脚本使用 PuTTY (PSCP.exe) 从 SFTP 站点下载 zip 文件。
我遇到的问题是,当作业运行时,它会连接到 SFTP 站点,并且 PuTTY 会发送回关于将服务器的主机密钥存储在注册表中的提示。我不想这样做,所以我试图通过管道将echo n
命令传递给 PuTTY。不过,这似乎不起作用。
$SrcPath = "/somedirectory/somewhere/files/"
$DstPath = "D:\Download\"
$currentDate = (Get-Date).ToString('yyyyMMdd')
$FileName = "$currentDate.zip"
$ArchivePath = "D:\Archive\"
$File = "$SrcPath$FileName"
Set-Location $DstPath
echo n | C:\"Program Files (x86)"\PuTTY\pscp -P 99999 -pw password username@{IP_ADDRESS}:$File $DstPath
# Check the file is there
If (Test-Path "$DstPath$FileName")
{
# Unzip the contents
C:\"Program Files"\7-Zip\7z.exe e "$DstPath$FileName"
#Move the zip file to the archive directory
Move-Item $DstPath$FileName $ArchivePath -force
}
如果我打开一个命令窗口并手动执行此操作,它工作正常。
例如在命令窗口中输入
C:\"Program Files (x86)"\PuTTY\pscp -P 99999 -pw password username@{IP_ADDRESS}:/somedirectory/somewhere/files/20121025.zip D:\Download\
然后n
在出现提示时按,正确下载文件。
当作业通过 SQL 代理运行时,它最初会出错并抱怨主机密钥,然后指出该文件不存在。
谁能指出我正确的方向?
您的第一个问题是 Putty/PSCP 出于安全原因想要为每个用户存储主机密钥(阻止 Fred 存储可用于诱使 George 信任假服务器的假主机密钥)。该
-batch
选项不会覆盖它,因为它被视为安全过程中的一个缺陷。因此,当您以交互方式运行它时很好,因为您可以接受您帐户的密钥。当您通过 SQL 代理运行它时,它希望为运行 SQL 代理服务的用户存储它。
如果您在“普通”用户帐户下运行 SQL 代理,那么解决此问题的一种方法是使用该帐户以交互方式登录,运行
pscp
命令并接受主机密钥。然后将其存储以供将来运行。另一种选择是考虑使用另一种工具来实现 SCP 功能。就我个人而言,我是 winscp ( http://winscp.net/ ) 的粉丝。WinSCP 允许您将主机密钥指定为连接字符串的一部分(这是一个 PowerShell 示例 - http://winscp.net/eng/docs/library#powershell)。
对于像我这样从谷歌来到这里的人:
pscp
现在有一个-hostkey
可以像这样使用的选项:pscp -P 22 -hostkey "ssh-ed25519 255 aa:bb:cc..." ...
这消除了使用交互式 PuTTY 会话来存储主机密钥的需要。这是文档必须说的:
看起来 pscp 有一个 -batch 开关,可以按照此处禁用交互式提示。
尝试类似: