Экспорт PATH с использованием NET :: SSH: PERL - PullRequest
1 голос
/ 04 января 2012

Я пишу сценарий оболочки для автоматизации некоторых утомительных задач, которые мы выполняем. Мне нужно 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;
   }

Какие-либо предложения относительно того, почему это могло произойти?

Ответы [ 3 ]

1 голос
/ 04 января 2012

Установить PATH при каждом вызове команды:

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

И BTW, Net :: SSH :: Perl больше не поддерживается, в настоящее время Net :: SSH2 и Net :: OpenSSH - лучшие альтернативы.

1 голос
/ 04 января 2012

cmd() не передает ваши команды в одну оболочку. Он выполняет их в отдельных оболочках (или без какой-либо оболочки - руководство не ясно об этом). Как только вы закончите export PATH, оболочка закроется, и новый PATH будет утерян.

Похоже, можно передать все соответствующие команды одному процессу оболочки в виде отдельных строк в $ stdin?

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

Это будет работать так же, как и при интерактивном входе в систему (но без управления терминалом, поэтому команды, которые общаются напрямую с терминалом, скорее всего, будут не работать).

В любом случае Net :: SSH :: Perl не выглядит лучшим инструментом для работы. Я бы предпочел использовать expect для автоматизации.

0 голосов
/ 04 января 2012

Записать команды в удаленный временный файл, затем выполнить его. Или пропустите элемент $ PATH и используйте полный путь для последующих команд (при условии, что вы это знаете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...