2

В настоящее время у меня установлен Cygwin и ssh на машину, и я запускаю такие команды.

ssh user@ip "command"

Единственная проблема заключается в том, что открытие нового сеанса SSH и выполнение каждой команды занимает много времени.

Итак, мой вопрос: возможно ли сохранить один сеанс ssh в фоновом режиме, чтобы я мог выполнять команды гораздо быстрее (и не нужно было открывать новый сеанс ssh для каждой команды)?

2 ответа2

2

Я работал над решением этой проблемы несколько месяцев назад, потому что это требовалось для одного проекта в моей нынешней работе. Проблема описана в openssh bugzilla, с прикрепленным патчем, который работает с отсутствующей функцией cygwin . Я также обсуждал это как с разработчиками, так и с сопровождающими cygwin , но похоже, что он еще не применяется ни в одном из этих выпусков.

Короче говоря

Cygwin не реализовал ни одного специального протокола обмена сообщениями, который позволяет передавать файловые дескрипторы между совершенно не связанными процессами в Unix. Со слов сопровождающего cygwin, реализовать эту функцию в Windows API кажется невозможным, поскольку файловые дескрипторы понимаются совершенно по-другому.

Я получил это от своего друга, который указал, что это довольно распространенная проблема, и я бы сделал счастливыми многих, если это сработает. Поэтому я начал взламывать и вместо этого придумал это решение с сокетами, которое успешно использовалось в вышеупомянутом инструменте - scap-workbench .

Как получить его?

Вот в чем вопрос. Я подумал, что должен написать кое-что как собрать свой ssh под Cygwin, так что это отличная возможность.

Сборка из источника

  1. Загрузите и установите cygwin с сайта cygwin.com
  2. Из репозитория 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
    
  3. Открыть терминал Cygwin

  4. Загрузите последнюю выпущенную портативную версию (в настоящее время 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. применить патч (я надеюсь, что он применяется по-прежнему гладко)

    wget https://raw.githubusercontent.com/Jakuje/stuff/master/openssh_without_fdpass.patch
    cat openssh_without_fdpass.patch | patch
    
  6. конфигурировать

    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. построить это!

    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)

0

Проблема с длительным запуском ssh-сессии иногда заключается в том, что SSH-сервер пытается найти имя хоста SSH-клиента. Попробуйте отредактировать файл конфигурации демона sshd в /etc /ssh_config и измените или добавьте (если его там нет) эту директиву:

UseDNS no

Сначала вы должны сгенерировать файл конфигурации с помощью команды:

ssh-host-config

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .