Я работал над решением этой проблемы несколько месяцев назад, потому что это требовалось для одного проекта в моей нынешней работе. Проблема описана в openssh bugzilla, с прикрепленным патчем, который работает с отсутствующей функцией cygwin . Я также обсуждал это как с разработчиками, так и с сопровождающими cygwin , но похоже, что он еще не применяется ни в одном из этих выпусков.
Короче говоря
Cygwin не реализовал ни одного специального протокола обмена сообщениями, который позволяет передавать файловые дескрипторы между совершенно не связанными процессами в Unix. Со слов сопровождающего cygwin, реализовать эту функцию в Windows API кажется невозможным, поскольку файловые дескрипторы понимаются совершенно по-другому.
Я получил это от своего друга, который указал, что это довольно распространенная проблема, и я бы сделал счастливыми многих, если это сработает. Поэтому я начал взламывать и вместо этого придумал это решение с сокетами, которое успешно использовалось в вышеупомянутом инструменте - scap-workbench .
Как получить его?
Вот в чем вопрос. Я подумал, что должен написать кое-что как собрать свой ssh под Cygwin, так что это отличная возможность.
Сборка из источника
- Загрузите и установите cygwin с сайта cygwin.com
- Из репозитория Cygwin установите - opensshи его зависимости (в основном этого списка должно быть достаточно):
 -  ./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
 
- Открыть терминал Cygwin 
- Загрузите последнюю выпущенную портативную версию (в настоящее время 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
 
- применить патч (я надеюсь, что он применяется по-прежнему гладко) - wget https://raw.githubusercontent.com/Jakuje/stuff/master/openssh_without_fdpass.patch
cat openssh_without_fdpass.patch | patch
 
- конфигурировать - 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
 
- построить это! - make CFLAGS=-g
 
Скачать готовый бинарный файл со всеми зависимостями
Доступно с fedorapeople.org
Призываю вверх по течению
Другая возможность - призвать openssh или cygwin применить этот патч. Это помогло бы большему количеству людей. Я не прилагал к этому особых усилий с момента публикации патча из-за других задач.
Минимальный контрольный пример
  # 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
(примечание ./ssh , потому что мы хотим вызвать двоичный файл, который встроен в текущий каталог, а не тот, который предоставлен cygwin, который находится в вашем $PATH)