Перейти к содержимому
Калькуляторы

Можно ли сделать альянс на аргументы?

Использую скрипт на 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 и не использующие системные библиотеки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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 этот аргумент не понимает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Net::SSH:Expect — кривой костыль, хотя если ничего другого не найду, придется разбираться с ним. И к тому же я не уверен, что с keyboard-interactive получиться его использовать.

Не кривей чем то что вы используете. Нормально он вяжется с чем угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А в чем проблема правки исходников? Не хотите лезть с модуль, установленный в системе? Тогда сделайте monkey patching модуля прямо из своего кода:

http://stackoverflow.com/questions/449690/how-can-i-monkey-patch-an-instance-method-in-perl

 

Патчить надо, судя по всему, ф-цию _master_ctl.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

sshpass не решит вашу проблему?

Не решит.

Сейчас у меня используется bash-скрипт, в котором используется переменная окружения SSH_ASKPASS.

Но теперь нужна сложная обработка данных, а shell-скрипт для этого подходит плохо.

 

А в чем проблема правки исходников?

Я не очень хорошо знаю Perl.

Да и не уверен, что эту проблему можно решить патчем пары строк — все-таки ключи O и S делают разные вещи.

 

Telnet проще сделать.

Можно пояснить?

Если имеется ввиду, что при telnet можно передать пароль — то это не основная проблема.

В этом случае можно использовать и expect, но тогда придется парсить вывод, отладочные сообщения, строку приглашения и т.п.

Net::OpenSSH удобен именно тем, что можно получить вывод, связанный непосредственно с переданной командой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как вариант - соберите где-нибудь сбоку еще один openssh требуемой версии и натравите на него Net::OpenSSH. Путь к ssh-клиенту задаётся вот так:

  my $ssh = Net::OpenSSH->new($host, ssh_cmd => '/opt/OpenSSH/bin/ssh');

 

А, вы уже даже новый пакет с OpenSSH нашли. Попробуйте его просто распаковать (тупо как архив, rpm2cpio) куда-нибудь и запустить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.