Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
使用NET::SSH:PERL导出路径_Perl_Export_Perlnetssh - Fatal编程技术网

使用NET::SSH:PERL导出路径

使用NET::SSH:PERL导出路径,perl,export,perlnetssh,Perl,Export,Perlnetssh,我正在编写一个shell脚本来自动化我们执行的一些繁琐任务。我需要ssh到服务器并远程更改PATH变量,使该变量保持不变,以便执行下一个命令。代码如下 sub ab_tier{ my $ssh=Net::SSH::Perl->new($host); $ssh->login($user2,$user2); my $PATH; my($stdout,$stderr,$exit)=$ssh->cmd("export PATH=/usr/bin/sudo:/local/per

我正在编写一个shell脚本来自动化我们执行的一些繁琐任务。我需要ssh到服务器并远程更改PATH变量,使该变量保持不变,以便执行下一个命令。代码如下

sub ab_tier{
 my $ssh=Net::SSH::Perl->new($host);
 $ssh->login($user2,$user2);
 my $PATH;
 my($stdout,$stderr,$exit)=$ssh->cmd("export
 PATH=/usr/bin/sudo:/local/perl-5.6.1/bin:$PATH");
 my($PATH, $stderr, $exit)=$ssh->cmd("echo $PATH");
 print $PATH; # Check the path for correctness : does not change 
}
然而,这条道路并没有改变。有没有其他方法来实现这一点,或者我做错了什么。我需要自动化任务,所以我不认为$ssh->shell在这里会有帮助。请建议


我根据建议进行了更改,一切正常。然而,我注意到另一个问题,这是在试图显示环境变量时发生的

  my $cmd_ref_pri={
    cmd0=>"echo $ENV{'HOME'}",
    cmd1=>"chmod 777 $ENV{'COMMON_TOP'}/temp"
  };
现在,我使用Net::SSH::Perl连接到远程服务器,$ENV{“HOME”}返回的值是my HOME目录的值,而不是远程服务器的值。但是,如果添加命令,如中所示:

    my $cmd_ref_pri={
       cmd0=>"whoami ; echo $ENV{'HOME'}",
       cmd1=>"chmod 777 $ENV{'COMMON_TOP'}/temp"
     };
然后显示的用户id是我使用ssh连接到远程服务器的用户的id。我没有安装其他模块,唯一可用的模块是Net:SSh:perl,因此我不得不使用它

执行命令的例程

    sub ssh_cmd{
       #$cmd_sub - contains command, $ssh contains object ref
       my ($cmd_sub,$ssh)=@_;
       my($stdout, $stderr, $exit)=$ssh->cmd("bash",$cmd_sub);
       if( $exit !=0){
       print $stdout;
       print  "ERROR-> $stderr";
       exit 1;
     }
    return 0;
   }
关于为什么会发生这种情况,有什么建议吗?

cmd()
没有将命令传递到一个shell中。它在单独的shell中执行它们(或者不使用任何shell-手册对此并不清楚)。一旦您完成
导出路径
,shell就会退出,新路径将丢失

看起来可以将所有相关命令作为单独的$stdin行传递给单个shell进程

my $stdin='export A=B
echo $A
';
$ssh->cmd("bash",$stdin);
这就像交互式登录一样(但没有终端控制,所以直接与终端对话的命令可能会失败)


无论如何,Net::SSH::Perl看起来并不是这项工作的最佳工具。我宁愿使用
expect
实现自动化。

将命令写入远程临时文件,然后执行该文件。或者,跳过$PATH,在后续命令中使用完整路径(假设您知道)

在每个命令调用上设置路径:

$ssh->cmd('PATH=/usr/bin/sudo:/local/perl-5.6.1/bin:$PATH echo $PATH');

顺便说一句,现在不再维护Net::SSH::Perl,它们是更好的替代品。

$PATH正在被Perl扩展,你必须摆脱它:
my($PATH,$stderr,$exit)=$SSH->cmd(“echo\$PATH”)(不过,这并不能解决您的问题)