在 SQL Server 代理中執行的 Powershell 腳本
我正在嘗試在 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)。