使用Net::SSH::Expect后,如何检查SSH连接是否成功?是否有布尔返回方法?
好的,我来帮你解决这个问题。Net::SSH::Expect 本身并没有提供一个直接返回布尔值的 is_connected() 方法,但我们可以通过几种可靠的方式来判断 SSH 连接是否成功建立,下面是具体的实现方案:
1. 通过 login() 方法的返回值判断初始连接状态
要注意:你当前的代码只是初始化了 SSH 对象的参数,并没有实际发起连接动作。真正的 SSH 连接是通过调用 login() 方法完成的,这个方法会返回1表示连接成功,0表示失败,非常适合用来做判断:
#!/usr/bin/perl use Net::SSH::Expect; my $ssh = Net::SSH::Expect->new ( host => 'hostip', user => 'user', password => 'password', raw_pty => 1, timeout => 10, # 建议加上超时时间,避免因网络问题无限阻塞 ); # 发起登录并检查结果 my $login_success = $ssh->login(); if ($login_success) { print "SSH 连接成功建立!\n"; # 这里可以执行后续的命令操作 } else { # 用 error() 方法获取具体失败原因(比如密码错误、主机不可达等) die "SSH 连接失败: " . $ssh->error(); } $ssh->close();
2. 后续检查连接是否存活
如果在连接建立后,你需要判断连接是否仍然有效,可以尝试执行一个简单的测试命令(比如 echo),通过 exec() 方法的返回值来验证:
# 检查现有连接是否还活着 if ($ssh->exec("echo 'connection check'")) { print "连接仍然有效\n"; } else { die "连接已断开: " . $ssh->error(); }
补充提示
- 一定要在
new()初始化时加上timeout参数,否则遇到网络异常时程序会一直卡住。 error()方法是排查连接问题的核心工具,它会返回详细的错误描述,帮你快速定位问题根源。
内容的提问来源于stack exchange,提问作者vkk05
相关产品推荐
相关产品推荐

