Я пишу сценарий оболочки для автоматизации некоторых утомительных задач, которые мы выполняем. Мне нужно 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 $cmd_ref_pri={
cmd0=>"whoami ; echo $ENV{'HOME'}",
cmd1=>"chmod 777 $ENV{'COMMON_TOP'}/temp"
};
Тогда отображаемый идентификатор пользователя относится к пользователю, который использует 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;
}
Какие-либо предложения относительно того, почему это могло произойти?