(relacionado a esta pergunta )
Ao usar o servidor sshd ( Win32-OpenSSH ) no Windows (com autenticação baseada em chave para automação), ele não funciona a menos que tenha STDIN (ou PTY). Por exemplo, executar isso (do cliente Debian Jessie openssh) funciona bem (retornando o nome de usuário do Windows):
ssh -4 -T -o Batchmode=yes winserver whoami
No entanto, esses dois não (eles simplesmente terminaram sem executar o comando e sem retornar nenhuma saída):
ssh -4 -T -o Batchmode=yes winserver whoami < /dev/null
ssh -4 -n -T -o Batchmode=yes winserver whoami
Isso apresenta um problema, pois é impossível executar comandos ssh não interativos de programas que não possuem STDIN aberto (como cron(8) ou atd(8) ).
Ao usar o servidor Debian openssh, é claro que funciona sem problemas. O problema ocorre apenas com servidores ssh do Windows (Falha com Win32-OpenSSH e FreeSSHD . Bitvise SSHD , no entanto, parece funcionar bem, mas estamos procurando soluções gratuitas para servidores ssh do Windows; código aberto, simples e mantidos são bônus)
Isso foi relatado , mas alguém tem uma solução ou solução nesse meio tempo?
No final, escrevi este wrapper ssh para contornar servidores OpenSSH com janelas com bugs que requerem STDIN mesmo para comandos não interativos que não o usam:
Ele usa apenas hostname e comando com argumentos para executar, nenhum outro parâmetro é permitido (eu os defino em
~/.ssh/config
), então você executa o script (por exemplo) comomyssh winserver whoami < /dev/null
. É apenas um wrapper em torno do cliente ssh, que fornece STDIN falso e, portanto, permite que sessões ssh não interativas sejam executadas a partir do cron(8) e atd(8)Obrigado Matija-Nalis pela pergunta e solução. Para ganho de outros, aqui está uma implementação python rudimentar.
ssh.py
python ssh.py <user> <hostname> <command>
Meu caso de uso foi semelhante: o trabalho do Jenkins falhou ao executar comandos remotos.