tl;dr; Как перехватить stderr из сценария, чтобы получить более конкретную ошибку, а не просто полагаться на общую ошибку из Net::OpenSSH?
У меня есть сложная проблема, которую я пытаюсь решить. Net::OpenSSH работает только с протоколом версии 2. Однако у нас есть ряд устройств в сети, которые поддерживают только версию 1. Я пытаюсь найти элегантный способ определить, является ли удаленный конец неправильной версией.
При подключении к устройству версии 1 в stderr появляется следующее сообщение.
Основные версии протокола отличаются: 2 против 1
Однако ошибка, возвращаемая Net::OpenSSH, выглядит следующим образом.
не удалось установить главное SSH-соединение: неверный пароль или главный процесс неожиданно завершился
Эта конкретная ошибка носит слишком общий характер и касается не только разницы в версии протокола. Мне нужно обрабатывать различия протоколов, переключаясь на другую библиотеку, я не хочу делать это для каждой ошибки подключения.
Мы используем довольно сложный процесс, изначально предназначенный для доступа только через telnet. Мы загружаем объект «comm», который затем определяет такие вещи, как тип маршрутизатора и т. д. Этот объект связи вызывает Net::OpenSSH для передачи команд.
Пример:
my $sshHandle = eval { $commsObject->go($router) };
my $sshError = $sshHandle->{ssh}->error;
if ($sshError) {
$sshHandle->{connect_error} = $sshError;
return $sshHandle;
}
Где ошибка протокола появляется на stderr здесь
$args->{ssh} = eval {
Net::OpenSSH->new(
$args->{node_name},
user => $args->{user},
password => $args->{tacacs},
timeout => $timeout,
master_opts => [ -o => "StrictHostKeyChecking=no" ]
);
};
Что я хотел бы сделать, так это передать ошибку протокола stderr вместо общей ошибки, возвращаемой Net:: OpenSSH. Я хотел бы сделать это в сценарии, но я не уверен, как захватить stderr из сценария.
Любые идеи были бы хорошы.