Sql-Server-2012

在 SQL Server 代理中執行的 Powershell 腳本

  • April 16, 2021

我正在嘗試在 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)。

引用自:https://dba.stackexchange.com/questions/27583