Я работал над решением этой проблемы несколько месяцев назад, потому что это требовалось для одного проекта в моей нынешней работе. Проблема описана в 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
)