alibek Posted January 13, 2015 Posted January 13, 2015 Использую скрипт на Perl для работы с маршрутизатором Cisco. Подключаюсь так: my $ssh = Net::OpenSSH->new('user@10.1.255.250', 'password'=>'pwd'); и получаю ошибку "unable to establish master SSH connection: control command failed". Включил дебаг, в выводе увидел такую строчку: "ssh: illegal option -- O". В актуальной версии OpenSSH ключ O есть. Но у меня на сервере установлен OpenSSH_3.9p1 и у него ключа O нет. Хотя есть ключ S, который судя по документации делает примерно то же самое. Обновить на сервере OpenSSH я не могу. Можно ли, не влезая в исходники Net::OpenSSH, научить его работать со старой версией OpenSSH? Или, если без обновления OpenSSH ничего нельзя сделать, можно ли его установить отдельно, чтобы он не затрагивал систему? На сервере RHEL4, OpenSSH_3.9p1. Нашел openssh-5.3p1-104.el6.i686.rpm, он для CentOS6 и должен подойти. Но я не могу его просто установить: # rpm -i --test openssh-5.3p1-104.el6.i686.rpm предупреждение: openssh-5.3p1-104.el6.i686.rpm: подпись RSA/MD5 V3: NOKEY, key ID c105b9de ошибка: Неудовлетворенные зависимости: libc.so.6(GLIBC_2.4) нужен для openssh-5.3p1-104.el6.i686 libc.so.6(GLIBC_2.8) нужен для openssh-5.3p1-104.el6.i686 libcrypto.so.10 нужен для openssh-5.3p1-104.el6.i686 libcrypto.so.10(OPENSSL_1.0.1) нужен для openssh-5.3p1-104.el6.i686 libcrypto.so.10(OPENSSL_1.0.1_EC) нужен для openssh-5.3p1-104.el6.i686 libcrypto.so.10(libcrypto.so.10) нужен для openssh-5.3p1-104.el6.i686 libfipscheck.so.1 нужен для openssh-5.3p1-104.el6.i686 libselinux >= 1.27.7 нужен для openssh-5.3p1-104.el6.i686 rpmlib(FileDigests) <= 4.6.0-1 нужен для openssh-5.3p1-104.el6.i686 rtld(GNU_HASH) нужен для openssh-5.3p1-104.el6.i686 rpmlib(PayloadIsXz) <= 5.2-1 нужен для openssh-5.3p1-104.el6.i686 Обновлять glibc, openssl и selinux я бы не хотел, чтобы не сломать софт, работающий на сервере. Может быть есть бинарники, собранные под RHEL4 и не использующие системные библиотеки? Вставить ник Quote
GrandPr1de Posted January 13, 2015 Posted January 13, 2015 Используйте силу expect. Вставить ник Quote
dimas Posted January 13, 2015 Posted January 13, 2015 А если добавить параметр ctl_path => ... и указать в нем ? Вставить ник Quote
alibek Posted January 13, 2015 Author Posted January 13, 2015 expect бы очень не хотелось использовать. Net::SSH::Perl не подходит, в Cisco ssh немного кривой, он поддерживает только keyboard-interactive, поэтому нормальной автоматической авторизации не сделать. Net::SSH:Expect — кривой костыль, хотя если ничего другого не найду, придется разбираться с ним. И к тому же я не уверен, что с keyboard-interactive получиться его использовать. Net::SSH2 у меня не работает, выдает "*** glibc detected *** double free or corruption (out): 0x08a3b198 ***" при подключении (скорее всего из-за старых библиотек). Net::OpenSSH был бы оптимальным, но версии модуля под старый OpenSSH я не нашел. А если добавить параметр ctl_path => ... и указать в нем Что указать? В этом параметре указывается каталог для сокетов. Этот каталог передается в OpenSSH после аргумента -O. А у меня OpenSSH этот аргумент не понимает. Вставить ник Quote
GrandPr1de Posted January 13, 2015 Posted January 13, 2015 Net::SSH:Expect — кривой костыль, хотя если ничего другого не найду, придется разбираться с ним. И к тому же я не уверен, что с keyboard-interactive получиться его использовать. Не кривей чем то что вы используете. Нормально он вяжется с чем угодно. Вставить ник Quote
sirmax Posted January 13, 2015 Posted January 13, 2015 sshpass не решит вашу проблему? Вставить ник Quote
Abram Posted January 13, 2015 Posted January 13, 2015 А в чем проблема правки исходников? Не хотите лезть с модуль, установленный в системе? Тогда сделайте monkey patching модуля прямо из своего кода: http://stackoverflow.com/questions/449690/how-can-i-monkey-patch-an-instance-method-in-perl Патчить надо, судя по всему, ф-цию _master_ctl. Вставить ник Quote
alibek Posted January 13, 2015 Author Posted January 13, 2015 sshpass не решит вашу проблему? Не решит. Сейчас у меня используется bash-скрипт, в котором используется переменная окружения SSH_ASKPASS. Но теперь нужна сложная обработка данных, а shell-скрипт для этого подходит плохо. А в чем проблема правки исходников? Я не очень хорошо знаю Perl. Да и не уверен, что эту проблему можно решить патчем пары строк — все-таки ключи O и S делают разные вещи. Telnet проще сделать. Можно пояснить? Если имеется ввиду, что при telnet можно передать пароль — то это не основная проблема. В этом случае можно использовать и expect, но тогда придется парсить вывод, отладочные сообщения, строку приглашения и т.п. Net::OpenSSH удобен именно тем, что можно получить вывод, связанный непосредственно с переданной командой. Вставить ник Quote
Abram Posted January 13, 2015 Posted January 13, 2015 Как вариант - соберите где-нибудь сбоку еще один openssh требуемой версии и натравите на него Net::OpenSSH. Путь к ssh-клиенту задаётся вот так: my $ssh = Net::OpenSSH->new($host, ssh_cmd => '/opt/OpenSSH/bin/ssh'); А, вы уже даже новый пакет с OpenSSH нашли. Попробуйте его просто распаковать (тупо как архив, rpm2cpio) куда-нибудь и запустить. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.