Estou tentando usar o Powershell em um trabalho do SQL Server Agent para baixar um arquivo zip. O script usa PuTTY (PSCP.exe) para baixar um arquivo zip de um site SFTP.
O problema que estou tendo é que, quando o trabalho é executado, ele se conecta ao site SFTP e o PuTTY envia um prompt de volta sobre como armazenar a chave do host do servidor no registro. Não quero fazer isso, então estou tentando canalizar o echo n
comando para o PuTTY. Isso não parece estar funcionando embora.
$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
}
Se eu abrir uma janela de comando e fizer isso manualmente, funcionará bem.
por exemplo, digitando isso na janela de comando
C:\"Program Files (x86)"\PuTTY\pscp -P 99999 -pw password username@{IP_ADDRESS}:/somedirectory/somewhere/files/20121025.zip D:\Download\
e, em seguida, pressionando n
quando o prompt aparecer, baixa os arquivos corretamente.
Quando o trabalho é executado por meio do SQL Agent, ele inicialmente apresenta erros reclamando sobre a chave do host e, em seguida, informa que o arquivo não existe.
Alguém pode me apontar na direção certa?
Seu primeiro problema é que Putty/PSCP deseja armazenar a chave do host para cada usuário por motivos de segurança (impedir que Fred armazene uma chave de host falsa que pode ser usada para convencer George a confiar em um servidor falso). A
-batch
opção não substituirá isso, pois é vista como uma falha no processo de segurança.Portanto, não há problema em executá-lo interativamente, pois você pode aceitar a chave da sua conta. Quando você o executa por meio do SQL Agent, ele deseja armazená-lo para o usuário que executa o serviço do SQL Agent.
Se você estiver executando o SQL Agent em uma conta de usuário 'normal', uma maneira de contornar isso é fazer login interativamente com essa conta, executar o
pscp
comando e aceitar a chave do host. Isso será armazenado para execuções futuras.A outra opção é usar outra ferramenta para a funcionalidade SCP. Pessoalmente, sou fã do winscp ( http://winscp.net/ ) por isso. O WinSCP permite que você especifique a chave do host como parte da string de conexão (aqui está um exemplo do PowerShell - http://winscp.net/eng/docs/library#powershell ).
Para quem como eu chegou aqui do Google:
pscp
agora tem uma-hostkey
opção que pode ser usada assim:pscp -P 22 -hostkey "ssh-ed25519 255 aa:bb:cc..." ...
Isso elimina a necessidade de uma sessão PuTTY interativa para armazenar a chave do host. Aqui está o que a documentação tem a dizer:
Parece que o pscp tem uma opção -batch que desativa os prompts interativos conforme aqui .
Tente algo como: