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

А если добавить параметр ctl_path => ... и указать в нем ?

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this