Can';t调用方法&x201C;发送”;在-Net::SSH::Expect Perl错误处的未定义值上
通过从本地服务器连接,我正在远程服务器上运行一些命令。为了实现这一点,我使用Can';t调用方法&x201C;发送”;在-Net::SSH::Expect Perl错误处的未定义值上,perl,ssh,Perl,Ssh,通过从本地服务器连接,我正在远程服务器上运行一些命令。为了实现这一点,我使用Net::SSH::Expectperl模块连接到远程服务器。此处正在建立连接,但有时执行命令时会出现以下错误- Can't call method "send" on an undefined value at ..... 这是我的密码: my ($ip, $user, $passwd) = ("my.ip.address.here","user", "password"); my $ssh = SSH_Connec
Net::SSH::Expect
perl模块连接到远程服务器。此处正在建立连接,但有时执行命令时会出现以下错误-
Can't call method "send" on an undefined value at .....
这是我的密码:
my ($ip, $user, $passwd) = ("my.ip.address.here","user", "password");
my $ssh = SSH_Connection( $ip, $user, $passwd );
my $command_to_execute = "<Command to be executed will build here>";
print "$command_to_execute\n";
$str = 'Bye';
$ssh->send("$command_to_execute; echo $str");
$output = $ssh->waitfor($str, undef);
$ssh->close();
print "END\n";
sub SSH_Connection {
my ( $host, $user, $passwd ) = @_;
my $ssh = Net::SSH::Expect->new (
host => $host, #ip
user => $user, #'user'
password => $passwd, #'password'
raw_pty => 1,
no_terminal => 0,
);
my $login_output;
my $handledie = eval {
$login_output = $ssh->login();
};
if ( $@ ) {
if ($@ =~ m/SSHConnectionError/i ) {
print "SSH Connection Error\n";
} elsif ( $@ =~ m/SSHProcessError/ix ) {
print "SSH Process Error\n";
} elsif ( $@ =~ m/SSHConnectionAborted/ix ) {
print "SSH Connection Aborted\n";
} else {
print "SSH Unknown Error: $@\n";
}
}
if ($login_output !~ /Last login/) {
die "Login has failed.";
} else {
return $ssh;
}
print "SSH to ip - $host failed\n";
}
my($ip,$user,$passwd)=(“my.ip.address.here”,“user”,“passwd”);
我的$ssh=ssh\u连接($ip、$user、$passwd);
我的$command_to_execute=“”;
打印“$command\u to\u execute\n”;
$str=‘再见’;
$ssh->send(“$command\u to\u execute;echo$str”);
$output=$ssh->waitfor($str,undf);
$ssh->close();
打印“结束\n”;
子SSH_连接{
我的($host,$user,$passwd)=@;
我的$ssh=Net::ssh::Expect->new(
主机=>$host,#ip
user=>$user,#'user'
password=>$passwd,#'password'
原始值=>1,
无_终端=>0,
);
我的$login\u输出;
我的$handledie=eval{
$login_output=$ssh->login();
};
如果($@){
如果($@=~m/SSHConnectionError/i){
打印“SSH连接错误\n”;
}elsif($@=~m/SSHProcessError/ix){
打印“SSH进程错误\n”;
}elsif($@=~m/SSHConnectionAborted/ix){
打印“SSH连接已中止\n”;
}否则{
打印“SSH未知错误:$@\n”;
}
}
如果($login\u output!~/Last login/){
“登录失败。”;
}否则{
返回$ssh;
}
打印“SSH到ip-$host失败\n”;
}
首先,我构建命令并将其存储在$command\u to\u execute
变量中
在命令执行结束时,我将获得关键字Bye
。所以我在等待关键字匹配
我的问题是—
$str
word我怀疑捕捉错误的方法不合适。请建议一个更好的解决方案。如中所述,您最终在
$ssh
中得到了一个未定义的值。可能前一行输出包含来自子例程的错误消息。原因可能是什么。因为如果我运行这个脚本5次,它就会失败2次。@vinodk89我想可能my$ssh=Net::ssh::Expect->new(…)
返回undef
。。但是您没有检查它,所以子返回$ssh
(即unde
)@HåkonHægland,我同意。那么,在这种情况下,我该如何改进我的脚本。@vinodk89-Hmm,从中可以看出,new()
似乎不会返回undef
,但是它会在非法参数上发出嘎嘎声。。正如在中已经提到的,您最终在$ssh
中得到了一个未定义的值。可能前一行输出包含来自子例程的错误消息。原因可能是什么。因为如果我运行这个脚本5次,它就会失败2次。@vinodk89我想可能my$ssh=Net::ssh::Expect->new(…)
返回undef
。。但是您没有检查它,所以子返回$ssh
(即unde
)@HåkonHægland,我同意。那么,在这种情况下,我如何改进我的脚本。@vinodk89-Hmm,从中可以看出,new()
似乎不会返回undef
,但它会在非法参数上发出嘎嘎声。。