Stavo lavorando a una soluzione per questo problema pochi mesi fa, perché era necessario per uno progetto nel mio attuale lavoro. Il problema è descritto in openssh bugzilla , con allegato toppa che funziona intorno ai dispersi cygwin
caratteristica. Stavo anche discutendo di questo con gli sviluppatori a monte e cygwin
manutentori, ma sembra che non sia ancora stato applicato in nessuna di queste versioni.
Breve storia lunga
Cygwin non ha implementato uno speciale protocollo di messaggistica che consente di passare i descrittori di file tra processi completamente indipendenti su Unix. Dalle parole di manutentore di cygwin, sembra impossibile implementare questa funzionalità nell'API di Windows, dal momento che i descrittori di file sono compresi in modo totalmente diverso.
Ho avuto questo però dal mio amico che ha sottolineato che questo è un problema abbastanza comune e renderebbe molte persone felici se questo avrebbe funzionato. Così ho iniziato a fare hacking e ho trovato questa soluzione con socket, che è stata utilizzata con successo nello strumento di cui sopra - scap-workbench
.
Come ottenerlo?
Questa è la domanda. Ho pensato che dovrei scrivere un po ' come costruire il tuo ssh sotto cygwin , quindi questa è una grande opportunità.
Costruisci dalla fonte
- Scarica e installa cygwin da cygwin.com
Dall'installazione del repository Cygwin openssh
e le sue dipendenze (in pratica questa lista dovrebbe essere sufficiente):
./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
Riapri il terminale Cygwin
Scarica l'ultimo rilasciato portatile versione (attualmente 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
applicare la patch (spero che si applica ancora liscia)
wget https://raw.githubusercontent.com/Jakuje/stuff/master/openssh_without_fdpass.patch
cat openssh_without_fdpass.patch | patch
configurare
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
costruiscilo!
make CFLAGS=-g
Scarica binario pronto con tutte le dipendenze
Disponibile dal fedorapeople.org
Urge a monte
Un'altra possibilità è di spingere openssh o cygwin ad applicare questa patch. Ciò lo renderebbe utile a più persone. Non ho fatto troppi sforzi in questo poiché ho pubblicato la patch, a causa di altri compiti.
Caso di prova minimo
# 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
(Nota ./ssh
, perché vogliamo invocare il binario che è costruito nella directory corrente e non quello fornito da cygwin, che è nel tuo $PATH
)
ssh user@ip "screen -command 'command1'; screen -command 'command2'; screen -command 'command3'
In questo modo, puoi controllarlo più tardi nelle schermate. In alternativassh user@ip "command$;command$;command$"
In questo modo, si ridurrebbe la quantità di connessione ssh a uno e quei comandi sarebbero anche quasi perfettamente paralleli.