#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.