Perl — удаленный запуск скрипта через SSH, который включает директиву require

#perl #ssh #require

#perl #ssh #требовать

Вопрос:

Рассмотрим следующие 2 сценария :

main.pl

 #!/usr/bin/env perl

require 'lib.pl';
testSub('Hello World');
  

lib.pl

 sub testSub
{
    my ($input) = @_;
    print $input, "n";
}
1;
  

Мне нужно запустить main.pl скрипт удаленно через SSH, используя sudo, включив его lib.pl в качестве зависимости.

Я знаю, как запустить один Perl-скрипт через SSH с помощью sudo :

 $ ssh user@host 'sudo perl' < /path/to/local/perl/script
  

Но в этом случае немедленно выдается следующая ошибка :

 Can't locate libs.pl in @INC (@INC contains: /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/lib/perl5/site_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl .) at - line XX.
  

Но как я мог бы сделать то же самое, включив другой скрипт в качестве зависимости?

Заранее всем спасибо.

Ответ №1:

Perl может просматривать локальную файловую систему на предмет включений и не может перезванивать через канал ssh для получения данных. Таким образом, вам либо нужно перенести библиотеки.перейдите на другую сторону перед выполнением программы или просто включите ее содержимое непосредственно в свою программу.

Если вам не нравится это делать, возможно, Object::Remote может вам помочь. Но не спрашивайте меня, как это использовать, я только слышал отличные отзывы об этом.

Комментарии:

1. Спасибо за ответ. Я изучу object::Remote . В то же время, было бы это поведение таким же, если бы я заменил строку ‘require’ соответствующим модулем Perl и использовал определение пакета ?

2. Да, это было бы то же самое. Perl понятия не имеет, что он волшебным образом должен туннелировать обратно через ssh-соединение и включать файлы из системы, в которой был запущен ssh.