【发布时间】:2015-01-20 02:56:31
【问题描述】:
tl;dr; 如何从脚本中捕获 stderr 以获得更具体的错误,而不是仅仅依赖来自 Net::OpenSSH 的一般错误?
我正在尝试解决一个棘手的问题。 Net::OpenSSH 仅适用于协议版本 2。但是我们有许多网络设备仅支持版本 1。我正在尝试寻找一种优雅的方法来检测远程端是否是错误的版本。
连接到版本 1 设备时,stderr 上会显示以下消息
协议主要版本不同:2 与 1
但是 Net::OpenSSH 返回的错误如下
无法建立主 SSH 连接:密码错误或主进程意外退出
这个特定的错误太笼统了,并不仅仅解决协议版本的差异。我需要通过切换到另一个库来处理协议差异,我不想为每个连接错误都这样做。
我们使用了一个相当复杂的过程,该过程最初仅用于 telnet 访问。我们加载一个“comm”对象,然后确定路由器类型等内容。该 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" ]
);
};
我想做的是传入标准错误协议错误,而不是 Net::OpenSSH 传回的一般错误。我想在脚本中执行此操作,但我不确定如何从脚本中捕获 stderr。
任何想法都将不胜感激。
【问题讨论】: