Eu tenho um arquivo em lotes cmd do Windows que deve recuperar a lista de arquivos que estão em um servidor FTP via sFTP usando o PuTTY PSFTP exe e usá-lo para processamento adicional. O cmd é:
echo ls | psftp -l myusername -pw mycomplexpwd FTPServerHostname > C:/Users/myuser/Desktop/ls.txt
É suposto produzir a listagem no ls.txt
arquivo que eu uso em outros scripts. Ao executar como um usuário normal, recebo a listagem bem. No entanto, ao usar o Agendador de Tarefas e agendar o script como SYSTEM
usuário, recebo apenas isso no arquivo de saída:
O diretório de trabalho remoto é /
psftp> quit
Eu imaginei que há um problema no |
uso do pipe ou algo assim, então também tentei usar essa sintaxe, mas também a mesma saída:
psftp -l myusername -pw mycomplexpwd FTPServerHostname < C:/Users/myuser/Desktop/lscmd.txt > C:/Users/myuser/Desktop/ls.txt
O que pode estar causando o problema ao agendar o trabalho como SYSTEM em vez do meu usuário? E como obter a listagem como SISTEMA? Observe que ao executar o script como Administrador (clique com o botão direito do mouse - Executar como Administrador) recebo a listagem bem, o problema é apenas ao usar o agendador de tarefas e agendar a tarefa como SISTEMA.
O SO é o Windows Server 2012 R2.
Então, depois de cavar um pouco, acontece que o PSFTP não reconhece as chaves do servidor ftp. Abri o cmd as
SYSTEM
( o que pode ser um pouco complicado! ) e conectei via PSFTP, aceitei confiar no host (servidor sFTP), e depois o script funcionou como esperado! Não causou problemas para outros usuários, pois eles foram usados em testes e tiveram o prompt anterior!Para sua informação, a chave também é armazenada no Registro em
HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
, para que possa ser adicionada lá para outros usuários se você não quiser fazer login manualmente (adicionei essa verificação no meu script para adicioná-la se estiver faltando para qualquer usuário que esteja executando o script).EDIT: acredito que meu maior problema foi obter o cmd
SYSTEM
para que eu possa depurar o que está acontecendo, uma vez que consegui (veja o link acima para saber como fiz isso) ficou claro para mim. Para referência e melhor clareza, abaixo está a saída do comando antes de adicionar a chave, apenas mascarando as partes sensíveis: