Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t调用方法&x201C;发送”;在-Net::SSH::Expect Perl错误处的未定义值上_Perl_Ssh - Fatal编程技术网

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
    ,但它会在非法参数上发出嘎嘎声。。