Jump to content
Калькуляторы

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

Не решит.

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

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

 

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

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

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

 

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.