Setup ssh em janelas de segundo plano

2

Atualmente eu tenho o cygwin instalado e o ssh em uma máquina e executo comandos assim.

ssh user@ip "command"

O único problema é que leva muito tempo para abrir uma nova sessão ssh e executar cada comando.

Então, minha pergunta: é possível manter uma sessão ssh em execução em segundo plano para que eu possa executar comandos em um ritmo muito mais rápido (e não ter que abrir uma nova sessão ssh para cada comando)?

    
por William 31.08.2015 / 19:11

2 respostas

2

Eu estava trabalhando na solução para esse problema há alguns meses, porque era necessário para um projeto no meu trabalho atual. O problema é descrito em openssh bugzilla , com anexos patch que funciona em torno do recurso cygwin ausente. Eu também estava discutindo isso com desenvolvedores upstream e cygwin maintainers, mas parece que ainda não foi aplicado em nenhuma dessas versões.

História curta

O Cygwin não implementou um protocolo especial de mensagens que permite passar descritores de arquivos entre processos completamente não relacionados no Unix. A partir das palavras do mantenedor do cygwin, parece impossível implementar esse recurso na API do Windows, já que os descritores de arquivo são entendidos de maneira totalmente diferente.

Eu percebi isso com meu amigo, que apontou que este é um problema bastante comum e eu faria muitas pessoas felizes se isso funcionasse. Então comecei a hackear e criei essa solução com sockets, que foi usada com sucesso na ferramenta acima mencionada - scap-workbench .

Como conseguir isso?

Essa é a questão. Eu pensei que eu deveria escrever algum how-to como construir o seu ssh no cygwin , então esta é uma ótima oportunidade.

Construir a partir da fonte

  1. Faça o download e instale o cygwin de cygwin.com
  2. Do repositório Cygwin, instale openssh e suas dependências (basicamente essa lista deve ser suficiente):

     ./setup-x86_64.exe -nq -P autoconf,automake,binutils,cygport,cygwin-devel,gcc-core,git,libcom_err-devel,libcom_err2,libcrypt-devel,libcrypt0,libedit-devel,libedit0,libgcc1,libgssapi_krb5_2,libiconv-devel,libiconv2,libintl-devel,libintl8,libk5crypto3,libkrb5-devel,libkrb5_3,libkrb5support0,libncurses-devel,libncursesw10,libopenssl100,libssp0-4.9.2-3,make,openssl-devel,w32api-headers,w32api-includes,zlib-devel,zlib0-1.2.8-3,git,wget
    
  3. Reabra o terminal Cygwin

  4. Baixe a versão mais recente portátil (atualmente 7.1p1)

    wget http://mirror.steadynet.cz/pub/OpenBSD/OpenSSH/portable/openssh-7.1p1.tar.gz # or you can choose different mirror
    tar zxvf openssh-7.1p1.tar.gz
    cd openssh-7.1p1
    autoreconf
    
  5. aplicar patch (espero que se aplique ainda suave)

    wget https://raw.githubusercontent.com/Jakuje/stuff/master/openssh_without_fdpass.patch
    cat openssh_without_fdpass.patch | patch
    
  6. configure

    mkdir build
    cd build
    ../configure --prefix=/usr \
         --sysconfdir=/etc \
         --libexecdir='${sbindir}' \
         --localstatedir=/var \
         --datadir='${prefix}/share' \
         --mandir='${datadir}/man' \
         --infodir='${datadir}/info' \
         --with-kerberos5 \
         --with-libedit \
         --with-xauth=/usr/bin/xauth \
         --enable-etc-default-login
    
  7. construa!

    make CFLAGS=-g
    

Baixe o binário pronto com todas as dependências

Disponível em fedorapeople.org

Instar a montante

Outra possibilidade é pedir ao openssh ou ao cygwin para aplicar este patch. Isso tornaria útil para mais pessoas. Eu não fiz muito esforço nisso desde que publiquei o patch, por causa de outras tarefas.

Caso de teste mínimo

  # initiate connection
SSH_HOST="user@hostname"
C_PATH="~/.ssh/master_%r@%h:%p.socket"
./ssh -M -f -N -o -p 314 ControlPath="$C_PATH" "$SSH_HOST"
 # do whatever commands you want
./ssh -o ControlPath="$C_PATH" "$SSH_HOST" -p 314 "echo test"
 # terminate connectino
./ssh -o ControlPath="$C_PATH" "$SSH_HOST" -p 314 -O exit

(note ./ssh , porque queremos chamar o binário que é construído no diretório atual e não aquele fornecido pelo cygwin, que está no seu $PATH )

    
por 31.08.2015 / 20:35
0

O problema com a sessão ssh de início longo é, às vezes, porque o servidor SSH está tentando pesquisar o nome do host do cliente SSH. Tente editar o arquivo de configuração do daemon sshd em / etc / ssh_config e modifique ou adicione (se não estiver lá) esta diretiva:

UseDNS no

Você precisa primeiro gerar o arquivo de configuração com o comando:

ssh-host-config
    
por 07.09.2015 / 12:11