Servidor OpenSSH no Windows se recusando a trabalhar sem STDIN mesmo em modo não interativo

4

(relacionado a esta pergunta )

Ao usar o servidor sshd ( Win32-OpenSSH ) no Windows (com as teclas autenticação baseada na automação), ele não funciona a menos que tenha STDIN (ou PTY). Por exemplo, rodando isto (do Debian Jessie openssh client) funciona OK (retornando o nome de usuário do windows):

ssh -4 -T -o Batchmode=yes winserver whoami

No entanto, esses dois não (eles simplesmente terminam 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 openssh da Debian, obviamente funciona sem nenhum problema. Problema só acontece com servidores ssh do Windows (Falha com Win32-OpenSSH e FreeSSHD . SSHD Bitvise , no entanto, parece funcionar bem, mas estamos olhando para soluções grátis para servidores windows ssh, open source, simples e mantidos são bônus)

Isso foi relatado , mas alguém tem solução ou solução alternativa nesse meio tempo?

    
por Matija Nalis 05.03.2017 / 17:05

2 respostas

2

É o fim, eu escrevi este wrapper ssh para contornar janelas OpenSSH com bugs que requerem STDIN até mesmo para comandos não interativos que não o usam:

#!/usr/bin/perl

use strict;
use warnings;
use Net::OpenSSH;

my $HOSTNAME = shift;
my $ssh = Net::OpenSSH->new($HOSTNAME);

my ($in_pipe, undef, undef, $pid) =
    $ssh->open_ex( { stdin_pipe => 1 }, @ARGV) or die "open_ex failed: " . $ssh->error;

waitpid($pid, 0);

Ele usa somente nome de host e comando com argumentos para executar, nenhum outro parâmetro é permitido (eu os defino em ~/.ssh/config ), portanto, você executa o script (por exemplo) como myssh 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 de cron (8) e atd (8)

    
por 06.03.2017 / 23:32
1

Obrigado Matija-Nalis pela pergunta e solução. Para o ganho do outro, aqui está uma implementação rústica em python.

ssh.py

import sys
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(sys.argv[2], username=sys.argv[1])
stdin, stdout, stderr = client.exec_command(sys.argv[3])
errlines = stderr.readlines()
outlines = stdout.readlines()
for l in outlines:
    print l.rstrip()
if len(errlines):
    print "WARNING: stderr generated:"
    for l in errlines:
        print l.rstrip()
exit(stdout.channel.recv_exit_status())

python ssh.py <user> <hostname> <command>

Meu caso de uso foi semelhante: o trabalho de Jenkins não pôde executar comandos remotos.

    
por 22.03.2017 / 21:20

Tags