Что такое Proxy32?

Proxy32 это “Native” (написанная специально для) XP/Vista/7 среда содержащая рабочий стол и терминал для CYGWIN.

Что понимается под “Native” Desktop&Terminal?

Терминал ( а также рабочий стол) нуждается в доступе к функциям графического рисования windows для того, чтобы отображать себя на мониторе windows. В программном обеспечении CYGWIN имеется два способа нарисовать окно:

Proxy32 использует "native" рисование Windows, поэтому он не расходует дополнительные компьютерные рессурсы на передачу запросов рисования по местной линии TCP/IP, а также на конверсию из одного языка рисования в другой во время выполнения программы.

Откуда появилось имя Proxy32?

Однажды я захотел добавить простую внешнюю надстройку для автоматизации к CYGWIN XTerm терминалу, чтобы пользователь мог добавлять ярлыки для часто используемых команд и скриптов (списков команд) "на лету" без необходимости заниматься каким-либо программированием. В то время такая надстройка могла бы быть написана на языке tcl/Expect/Tk, но я хотел, чтобы мое программное обеспечение было написано на чистом C++ без всякой зависимости от интерпретатора tcl и библиотек Expect и Tk. Весной 2002-го эта внешняя надстройка для автоматизации была готова в виде отдельной программы CYGWIN "Telnet Proxy". Она загружала список команд и ярлыков из текстового файла конфигурации при старте и отображала список команд и ярлыков в своем собственном окне терминала. Чтобы использовать автоматизацию, любой Telnet терминал должен был установить Telnet соединение через "Telnet Proxy" с удаленным компьютером (вместо того, чтобы подключаться напрямую к удаленному компьютеру). После этого, когда пользователь нажимал ярлык (клавишу, ассоциированную с конкретной командой) в окне терминала программы "Telnet Proxy", программа "Telnet Proxy" вставляла выбранную пользователем команду в поток байтов Telnet по направлению к удаленному компьютеру. К этому времени COMMAND/SCRIPT/PLUGIN пускачи, а также разделение сессии терминала уже поддерживались в программе, хотя дерево пускачей существовало в его доисторической форме меню, управляемое с клавиатуры в окне терминала программы "Telnet Proxy".

Когда я конвертировал программу на Java/Swing в 2003-2004 годах. небходимость использовать внешний терминал подключенный через "telnet-proxy" отпала. Версия на Java имела настоящее графическое дерево пускачей и свой собственный терминал (написаный на Swing), который выполнял команды/скрипты/плугины когда пользователь делал двойной клик на них на дереве пускачей. Встроенный Java терминал поддерживал ssh через использование местного CYGWIN OpenSSH ssh интерактивного слиента в качестве бакенда (через программу "ptyopen", которая вероятно появилась из примеров в книге W. Richard Stevens 1992). Несмотря на то, что это больше не было чистое "telnet-proxying", имя "Proxy" осталось, так как оно подразумевало, что программа посредничала (proxying) между пользователем и удаленным компьютером, посылая команды от имени пользователя терминала вместо того чтобы пользователь печатал команды вручную на терминале.

В 2005 году я конвертировал программу на C++ чтобы использовать низкоуровневое Win32 API (чтобы уменьшить использование оперативной памяти и получить доступ к COM-PORTs). Поскольку программа использовала Win32 API, имя изменилось на Proxy32, чтобы избежать путаницы со старой версией которая была написана на Java/Swing.

Что я могу делать в Proxy32?

Короткий ответ:

"Все что я могу делать в CYGWIN", поскольку Proxy32 это просто еще один графический интерфейс для работы с CYGWIN. Если задать вопрос "что можно делать в CYGWIN?", то ответ будет: "все, что можно делать в LINUX" (поскольку большая часть программного обеспечения CYGWIN импортирована из мира LINUX). А в LINUX можно делать практически все, что угодно, поскольку LINUX имеет огромное разнообразие программного обеспечения, пригодного для выполнения широкого круга задач.

Технические детали:

А добавляет ли Proxy32 что-нибудь к возможностям CYGWIN? Да, конечно.

Для начала, Proxy32 имеет дерево пускачей. Оно позволяет пользователю собирать все пускачи (чтобы запускать терминалы, скрипты и приложения) в одно большое графическое дерево. Это дерево пускачей похоже на дерево Избранное/Закладки в популярных браузерах за исключением того, что оно позволяет создавать закладки не только для открытия веб страниц, но и для нескольких других действий ( создание терминалов, выполнение команд и скриптов в терминалах, запуск приложений Windows). Дерево можно редактировать средствами графической оболочки (диалог редактирования пускачей и drag-n-drop). Оно сохраняется/загружается/экспортируется/импортируется в формате XML. Формат XML позволяет выполнять массовое редактирование пускачей в обычном текстовом редакторе, а также позволяет с легкостью передавать готовое дерево пускачей от одного пользователя к другому.

Оставшаяся часть уникальных возможностей Proxy32 находится главным образом на стороне терминала.

Что такое CYGWIN?

Короткий ответ:

CYGWIN - это:

Технические детали:

Программное обеспечение LINUX посылает системные запросы (например, прочитать из файла или напечатать текст) в ядро LINUX. Сердцем проекта CYGWIN является библиотека CYGWIN1.DLL, которая может транслировать системные запросы в стиле LINUX в системные запросы в стиле Windows и передавать их ядру Windows для выполнения. Другим ключевым компонентом проекта CYGWIN является компилятор CYGWIN GCC, который может взять исходный код программного обеспечения LINUX и создать выполняемый файл таким образом, что он будет посылать свои системные запросы в библиотеку CYGWIN1.DLL вместо того, чтобы посылать их в ядро LINUX. Как только программное обеспечение перекомпилировано, чтобы использовать CYGWIN1.DLL, оно будет выполняться на Windows, если библиотека CYGWIN1.DLL присутствует.

Все программное обеспечение, которое было перекомпилировано, чтобы использовать библиотеку CYGWIN1.DLL, является частью проекта CYGWIN. Все это обеспечение (вместе с библиотекой CYGWIN1.DLL и компилятором GCC) может быть загружено с домашней страницы проекта CYGWIN http://www.cygwin.com.

Должен ли я иметь некоторое начальное знание CYGWIN/LINUX перед тем как я начну использовать Proxy32?

Короткий ответ:

Да. Вероятно Proxy32 обеспечит наиболее быстрый и легкий способ получить доступ к подсказке CYGWIN Bash. Он также поможет пользователю организовать растущее знание команд CYGWIN в документированной и готовой к использованию форме. Но кроме этих двух отличий пользователь все же должен изучать команды CYGWIN вне зависимости от того, использует он Proxy32 или нет.

Технические детали:

После того, как Proxy32 файл загружен и запущен, он автоматически создает инсталляцию CYGWIN (с заранее выбранным набором програмных пакетов) и запускает CYGWIN Bash в терминале Proxy32 в конце процесса инсталляции. Через несколько минут после нажатия кнопки "Установить" ("Install") Proxy32 пользователь получит подсказку CYGWIN Bash в открытом окне терминала внутри "рабочего пространства 0".

После этого можно начать изучать команды CYGWIN, которые можно выполнять в Bash.

В Proxy32 пользователь может сохранять полезные команды в виде пускача COMMAND на дереве пускачей. Таким образом команда будет сохранена в форме, которая готова для выполнения в будущем, путем двойного кликанья на ней. Кроме того, пользователь может прикрепить подробный текст тултипа к пускачу команды, например, чтобы показать результат распечатки команды, которая сконфигурирована в данном пускаче COMMAND. Пускачи команд (COMMAND) могут быть сгруппированы в поддерево (SUBTREE) на дереве пускачей. Пользователь может находить команды на дереве пускачей, используя встроенную функцию поиска (PERL REGEX).

Почему Proxy32 не лицензирован под GPL?

Процесс Proxy32 не линкуется к какой либо статической или динамической библиотеке CYGWIN, так что он не должен быть лицензирован под GPL. Встроенный терминал Proxy32 использует механизм связи между процессами Windows, чтобы управлять отдельным CYGWIN TTY-драйвер процессом, который называется "proxycygterm". Я создал код "proxycygterm" из кода "cygterm" в марте 2006 года, чтобы использовать его как новый интерфейс между терминалом Proxy32 и CYGWIN TTY. Исходный код программы "proxycygterm" опубликован здесь (поскольку код программы cygterm лицензирован под GPL). Исходный код не модифицированных выполняемых файлов CYGWIN, которые устанавливаются вместе с Proxy32, опубликован здесь.

Как терминал Proxy32 управляет внешними бакендами (SHELLs)?

Можно думать о внешнем бакенде терминала как о местном дочернем процессе, с которым пользователь взаимодействует через терминал. Этот дочерний процесс в свою очередь может представлять или местный Shell или удаленный компьютер, подключенный через соединение TELNET/FTP/SSH/SFTP/COM-PORT. Встроенный терминал Proxy32 использует механизм связи между процессами Windows, чтобы контролировать отдельно стоящие внешние бакенды. При "подключении" (connect) терминал Proxy32 запускает сконфигурированный бакенд (SHELL) как дочерний процесс и общается с ним через трубы (потоки ввода/вывода) STDIN/STDOUT/STDERR. Наиболее мощным бакендом является процесс TTY-драйвера CYGWIN, который называется "proxycygterm". Он создает подчиненный CYGWIN TTY и запускает сконфигурированное приложение CYGWIN на этом TTY. При изменении размера терминала Proxy32 он посылает TELNET команду NAWS на STDIN программы proxycygterm, чтобы изменить размер подчиненного CYGWIN TTY, чтобы он соответствовал новому размеру терминала Proxy32. Если командная строка для запуска бакенда не содержит слова proxycygterm, тогда команда NAWS не посылается из терминала Proxy32 на STDIN бакенд процесса. Если бакенд процесс закончил работу или упал, то терминал Proxy32 "отключается" (disconnect) автоматически. Если пользователь "отключает" (disconnect) терминал Proxy32 вручную, то бакенд процесс и все дерево процессов, которое он создал, автоматически убивается.

Пример командной строки бакенд процесса (SHELL) для запуска CYGWIN Bash на proxycygterm TTY в терминале Proxy32: “proxycygterm.exe -s ‘/usr/bin/bash -i -l’” Строка приведна так как она вводится в конфигурацию пускача SHELL-TERMINAL.

Какие внешние бакенды (SHELLs) можно использовать с терминалом Proxy32?

Бакенды являются очень важными компонентами, поскольку они расширяют функциональные возможности Proxy32.

Какие протоколы поддерживаются для подключения терминала Proxy32 к удаленному компьютеру?

Как подключить терминал Proxy32 к кластеру удаленных компьютеров?

Можно использовать в SHELL-TERMINAL пускаче командную строку “proxycygterm.exe -s ‘/usr/bin/screen -s bash’”. Она запустит локальное приложение CYGWIN GNU “screen” (для мультиплексирования множественных виртуальных vt100 терминалов в один физический терминал) на CYGWIN TTY созданном интерфейсной программой “proxycygterm.exe”.

Как только приложение CYGWIN GNU "screen" инициализировалось и запустило bash shell, используйте цепочку из 3-х клавиатурных команд "^aS" затем "^aTAB" затем "^ac" чтобы разделить окно терминала на две части, переключиться на вновь созданную часть, создать в ней второй виртуальный vt100 терминал и запустить новый shell во втором виртуальном терминале.

После этого можно использовать оба виртуальных терминала независимо и переключать ввод клавиатуры между ними с помощью клавиатурной комбинации "^aTAB" (означает нажмите сначала "Ctrl-a" затем нажмите "TAB"). Используйте "^aS" затем "^aTAB" затем "^ac" чтобы создать больше виртуальных vt100 терминалов в том же самом физическом терминале Proxy32.

Этот режим удобен чтобы управлять множественными соединениями из одного физического окна терминала Proxy32 под управлением одного скрипта/plugin.

Такая операция позволяет иммитировать "cluster" (или "vector") терминал когда множественные подключения к нескольким сетевым узлам устанавливаются в одном окне терминала и под управлением одого скрипта/плугин.

Команда '^a:caption always "%w"' создаст статусную строку под экраном каждого виртуального терминала.

Что такое разделение сессии терминала Proxy32?

Зачастую целая группа людей, работающих на разных компьютерах и даже из разных мест, должны разделять одну и ту же сессию терминала. Разделенная сессия означает, что вся группа печатает на общей клавиатуре (по очереди) и видит один и тот же экран с результатами команд, приходящими с удаленного компьютера. Такая разделяемая сессия может быть либо подключение к удаленному компьютеру, либо работа в местном CYGWIN. Когда такая "разделенная" сессия может быть нужна:

Какие протоколы поддерживаются для разделения сессии терминала Proxy32 с удаленными пользователями?

Каждое окно терминала Proxy32 содержит встроенный TELNET/TLS сервер и один "слушающий" COM-PORT для разделения существующей терминальной сессии с удаленными пользователями. Удаленные пользователи подключаются по протоколам TELNET, TELNET/TLS или Serial к терминалу Proxy32, чтобы получить копию экрана удаленного компьютера и чтобы печатать команды в разделенную сессию терминала. Только один пользователь в любой момент времени может печатать команды для удаленного компьютера (разделенная сессия означает общая клавиатура и общий экран), в противном случае удаленный компьютер не сможет распознать команды. Местный пользователь в терминале Proxy32 может переключать удаленных пользователей в режим "только для чтения", в котором они будут продолжать получать результаты команд с удаленного компьютера, но они не смогут печатать свои команды на удаленный компьютер.

Что такое Proxy32 плугина?

Proxy32 плугина - это дочерний процесс, который запущен из терминала, чтобы дать программисту контроль над взаимодействием с удаленным компьютером. Интерфейс Proxy32 плугины с терминалом лучше, чем программный интерфейс ActiveX/COM, который используется в других автоматизированных терминалах:

Ниже приведено краткое описание интерфейса плугины, который позволяет управлять терминалом и удаленным компьютером:

Чтобы автоматически завершить логин для SHELL-TERMINAL пускача со следующей командной строкой :

“proxycygterm.exe -s ‘/usr/bin/ftp 192.168.1.9 21′” 

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

perl -e '
$a="";while(){sysread STDIN,$_,10000;syswrite STDERR,$_;$a.=$_;last if $a=~/Name/;}
syswrite STDOUT,\'belous\';syswrite STDOUT,"\r\n";
$a="";while(){sysread STDIN,$_,10000;syswrite STDERR,$_;$a.=$_;last if $a=~/assword:/;}
syswrite STDOUT,\'test123\';syswrite STDOUT,"\r\n";
$a="";while(){sysread STDIN,$_,10000;syswrite STDERR,$_;$a.=$_;last if $a=~/ftp>/;}
'

Это семь строчек кода (1-7):

  1. Запускает интерпретатор PERL и говорит ему о том, что PERL скрипт, который должен быть выполнен, находится на командной строке интерпретатора (после командного свитча '-e'). Одиночная кавычка в конце строки начинает строчную переменную, которая содержит PERL скрипт.

  2. Бесконечный цикл: читает байты с удаленного компьютера (STDIN), передает их на экран терминала (STDERR) и сканирует эти байты на присутствие подсказки/фразы ‘Name’. Цикл завершается, когда подсказка найдена.

  3. посылает имя пользователя "belous" на удаленный компьютер (STDOUT), а затем посылает символы возврата каретки и новой строки.

  4. Бесконечный цикл: читает байты с удаленного компьютера (STDIN), передает их на экран терминала (STDERR) и сканирует эти байты на присутствие подсказки/фразы ‘assword:’. Цикл завершается, когда подсказка найдена.

  5. посылает пароль пользователя "test123" на удаленный компьютер (STDOUT), а затем посылает символы возврата каретки и новой строки.

  6. Бесконечный цикл: читает байты с удаленного компьютера (STDIN), передает их на экран терминала (STDERR) и сканирует эти байты на присутствие подсказки/фразы ‘ftp>’. Цикл завершается, когда подсказка найдена. Это последняя строка скрипта PERL. После нее плугина завершается и соединение между удаленным компьютером и клавиатурой/экраном пользователя автоматически восстанавливается.

  7. Одиночная кавычка на этой строке представляет собой конец строчной переменной, которая содержит PERL скрипт.

Обратите внимание, что эта плугина разработана так, чтобы запускаться автоматически при соединении терминала с удаленным компьютером. Автоматический запуск плугины достигается путем размещения пускача плугины непосредственно под пускачем SHELL-TERMINAL на дереве пускачей. Когда пользователь делает двойной клик на пускаче SHELL-TERMINAL, терминал подключается к удаленному компьютеру, а затем начинает искать PLUGIN/I-SCRIPT пускач под пускачем SHELL-TERMINAL. Если такой PLUGIN/I-SCRIPT найден под пускачем SHELL-TERMINAL, то он выполняется немедленно без вмешательства пользователя. Если бы пускач плугины был запущен вручную то было бы уже слишком поздно ожидать подсказку 'Name' от FTP сервера. В этом случае плугина начнет читать байты с удаленного компьютера после того, как подсказка 'Name' уже ушла на терминал. Плугина будет висеть, ожидая подсказку 'Name' в бесконечном цикле (до тех пор, пока пользователь не убьет ее).

Что такое режим запуска на отдельном рабочем столе Windows?

Proxy32 может создать отдельный рабочий стол Windows и запустить на нем свою графическую оболочку. В этом случае программы, которые запущены на общем рабочем столе Windows, не смогут взаимодействовать с графической оболочкой Proxy32 (манипулировать окнами Proxy32 и посылать в них нажатия клавиш и мыши). Когда Proxy32 запущена на отдельном столе, она позволяет пользователю переключаться между отдельным рабочим столом Windows и общим рабочим столом Windows с помощью специальной комбинации клавиш. Режим запуска Proxy32 на отдельном рабочем столе может использоваться для выполнения очень важных задач, когда пользователь хочет исключить возможность вмешательства в его работу со стороны других программ.