我创建了一个Perl模块,该模块将用于许多Perl脚本以使用Net::SSH::Expect
进行登录。
package myRoutines;
#
use v5.22;
use strict;
use warnings;
use Net::SSH::Expect;
use Exporter qw(import);
our @EXPORT_OK = qw(my_login);
sub my_login {
my $user = 'xxxx';
my $port = '10000';
my $passwd = 'XYZ';
my $adminServer = 'myServer';
my $rootpassword = 'ABCDEF';
my ( $pName, $vName ) = @_;
our $ssh = Net::SSH::Expect->new(
host => "$adminServer",
ssh_option => "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null",
user => "$user",
password => "$passwd",
port => "$port",
raw_pty => 1,
restart_timeout_upon_receive => 1,
log_file => "/var/tmp/clilog_$pName$vName"
);
eval {
my $login_output = $ssh->login();
if ( $login_output !~ />/ ) {
die "Login has failed.
Login output was $login_output";
}
};
return $ssh;
}
1;
这些脚本将执行以下操作:
use myRoutines qw(my_login);
our ( $ssh, $pName, $vName );
$pName = 'abc';
$vName = '123';
$ssh = my_login( $pName, $vName );
$ssh->send( "some commandr" );
如果我在脚本和模块所在的目录中,这一切都有效。如果我在任何其他目录中,new
调用有效,但对$ssh->send
的调用没有任何作用。
我尝试添加到我的脚本中:
use lib '/some/dir';
(.pm 文件所在的位置)以强制它找到模块,当我不在 pm 文件所在的目录中时,这似乎有效。
我尝试过:
use File::chdir;
$CWD = '/some/dir';
再一次,登录似乎有效,但下一次发送什么也不做。所以我对可能发生的事情感到茫然,并希望得到一些建议。
更新20170908:
在进一步播放并遵循提出的建议后,我已经完成了以下操作,现在可以工作了:
删除了评估,因为它是不必要的。 删除了我们的,使其成为我的。 删除了"的
在脚本中设置以下内容:
use File::Basename;
use Cwd qw( abs_path );
chdir "/some/dir";
use lib dirname(abs_path($0));
my $scriptName = basename($0);
use myRoutines qw(ovm_login);
my $pName = substr($scriptName,0,-3); (cutting off the .pl from the end of the script name to pass the scriptname as the pName)
使用 chdir 将目录更改为我的 pl 脚本和 pm 文件所在的位置,然后设置 lib 似乎可以正常工作。
鲍罗丁,我不确定我是否理解你的意思,当你说要面向对象模块并且......但有兴趣听到更多以更好地理解。
如果不想对目录进行硬编码,可以使用
use FindBin qw( $RealBin );
use lib $RealBin;
($RealBin
是脚本的路径。如果myRoutines.pm
在子目录中,请根据需要进行调整。
简单易行的方法是将.pm
文件放在:/usr/lib64/perl5/
目录,你应该没有任何问题。 但仍然不是完美的解决方案,您应该能够将.pm
文件放在您想要的任何位置。