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
- Faça o download e instale o cygwin de cygwin.com
-
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
-
Reabra o terminal Cygwin
-
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
-
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
-
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
-
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
)