首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模块cwd帮助

模块cwd帮助
EN

Stack Overflow用户
提问于 2017-09-08 03:07:58
回答 2查看 74关注 0票数 0

我创建了一个Perl模块,该模块将在许多Perl脚本中使用,以便使用Net::SSH::Expect进行登录。

代码语言:javascript
复制
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;

这些脚本将执行以下操作:

代码语言:javascript
复制
use myRoutines qw(my_login);

our ( $ssh, $pName, $vName );

$pName = 'abc';
$vName = '123';

$ssh = my_login( $pName, $vName );

$ssh->send( "some command\r" );

如果我在脚本和模块所在的目录中,这一切都有效。如果我在任何其他目录中,则new调用可以工作,但对$ssh->send的调用什么也不做。

我尝试添加到我的脚本中:

代码语言:javascript
复制
use lib '/some/dir'; 

( .pm文件所在的目录)来强制它查找模块,当我不在pm文件所在的目录中时,这似乎是可行的。

我试过:

代码语言:javascript
复制
use File::chdir;
$CWD = '/some/dir'; 

同样,登录似乎可以工作,但下一次发送什么也不做。因此,我对可能发生的事情感到困惑,并希望得到一些建议。

更新20170908:

在进一步尝试并遵循提出的建议后,我做了以下工作,现在它可以工作了:

删除了eval,因为它是不必要的。删除了our的并将其设置为my's。删除了“”

在脚本中设置以下内容:

代码语言:javascript
复制
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似乎可以正常工作。

Borodin,当你说面向对象模块时,我不确定我是否理解你的意思。但是有兴趣听到更多,以便更好地理解。

EN

回答 2

Stack Overflow用户

发布于 2017-09-08 03:35:20

如果不想对目录进行硬编码,可以使用

代码语言:javascript
复制
use FindBin qw( $RealBin );
use lib $RealBin;

($RealBin是脚本的路径。如果myRoutines.pm在子目录中,请根据需要进行调整。)

票数 2
EN

Stack Overflow用户

发布于 2017-09-08 03:19:17

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46103513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档