【问题标题】:Export PATH using NET::SSH:PERL使用 NET::SSH:PERL 导出 PATH
【发布时间】:2026-01-09 09:45:02
【问题描述】:

我正在编写一个 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 
}

但是 PATH 不会改变。是否有另一种方法来实现这一点,或者我做错了什么。我需要自动化任务,所以不要认为 $ssh->shell 在这里会有所帮助。请建议。


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

  my $cmd_ref_pri={
    cmd0=>"echo $ENV{'HOME'}",
    cmd1=>"chmod 777 $ENV{'COMMON_TOP'}/temp"
  };

现在我正在使用 Net::SSH::Perl 连接到远程服务器,$ENV{"HOME"} 返回的值是我的主目录的值,而不是远程服务器的值。但是,如果我添加如下命令:

    my $cmd_ref_pri={
       cmd0=>"whoami ; echo $ENV{'HOME'}",
       cmd1=>"chmod 777 $ENV{'COMMON_TOP'}/temp"
     };

然后显示的用户 id 是我使用 ssh 到远程服务器的用户。我没有安装其他模块,唯一可用的模块是 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;
   }

关于为什么会发生这种情况的任何建议?

【问题讨论】:

  • $PATH 正在被 perl 扩展,你必须转义它:my($PATH, $stderr, $exit)=$ssh->cmd("echo \$PATH");(不过,这不会解决你的问题)

标签: perl export perlnetssh


【解决方案1】:

cmd() 没有将您的命令传递到一个 shell。它在单独的外壳中执行它们(或没有任何外壳 - 手册不清楚)。一旦你完成export PATH,shell 就会退出并且新的 PATH 会丢失。

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

my $stdin='export A=B
echo $A
';
$ssh->cmd("bash",$stdin);

这就像交互式登录一样工作(但没有终端控制,因此直接与终端对话的命令可能会失败)。

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

【讨论】:

    【解决方案2】:

    在每个命令调用上设置 PATH:

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

    顺便说一句,Net::SSH::Perl 不再被维护,现在Net::SSH2Net::OpenSSH 是更好的选择。

    【讨论】:

      【解决方案3】:

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

      【讨论】: