如何在远程主机上调用 perl 子例程(可能通过系统命令)?

Posted

技术标签:

【中文标题】如何在远程主机上调用 perl 子例程(可能通过系统命令)?【英文标题】:How to call a perl subroutine on a remote host (possibly via system command)? 【发布时间】:2022-01-13 10:03:18 【问题描述】:

我想在远程主机上调用 Perl 子例程。怎么办?

我想做的是(这是行不通的):

my $sshCmd = "ssh";
my var1="ABC";

&sshToUpdateSim;

sub simUpdate 

    $var1="32";
    print "inside sub, $var1 is var1\n";


sub sshToUpdateSim

    system (" $sshCmd machinewin10 \"simUpdate() \"");  ### Causing Issue (sh: simUpdate : command not found)


print "$var1 is var1 now";

这里需要在远程主机“machinewin10”上调用子程序“simUpdate”。

我们将不胜感激。

提前感谢您!

【问题讨论】:

我认为你做不到。你也许可以传递一些 perl 代码并让新进程评估代码。 明确一点,你想在远程机器上调用perl子命令吗? @WilliamPursell 是的,我希望在远程机器上调用 Perl 子例程 【参考方案1】:

这似乎是XY problem。你试图做的事情没有多大意义。我们或许可以提出更好的方法,但我们需要更多关于该问题的背景信息。

您正在将此字符串传递给system()

ssh machinewin10 "&simUpdate "

这使用ssh 连接到“machinewin10”并运行命令“&simUpdate”。 '&' 对远程机器的 shell 有特殊的含义(它将前面的命令作为后台进程运行 - 但没有前面的命令)并且错误消息告诉您该机器上没有命令 simUpdate - 应该会出现不足为奇。

我能想到两件你可能想在这里做的事情。

您可能希望simUpdate() 返回一个字符串,其中包含您要在远程计算机上运行的命令。在这种情况下,您不能从带引号的字符串中调用子例程。你需要这样的东西:

sub simUpdate 
  return 'some_command';


sub sshToUpdateSim 
  system ("$sshCmd machinewin10" . simUpdate());

或者,您可能真的想在远程机器上运行子例程。如果没有大量的工作,这是行不通的。您不能只从命令行运行子例程。您将需要在远程机器上安装一个包含您的子例程的程序,然后从您的ssh 调用中运行该程序,向其传递使其运行所需子例程的参数。在不知道它对您有用的情况下,我没有时间为此选项提供完整的解决方案。

总而言之,正如我在此答案开头所说的那样,您需要向我们提供更多关于您在此处尝试做什么的详细信息。

哦,还有一件事。自 1994 年 Perl 5 发布以来,在 Perl 子例程调用上使用 & 符号是我们不需要做的事情。它仍然有效(如您所见),但通常不是一个好主意,因为它看起来不像子例程调用并且可以有奇怪的副作用。详情请见Subroutines and Ampersands。

【讨论】:

是的,我需要在远程主机上运行一个 Perl 子例程,正如你所说,你知道安装模块/程序会有所帮助,所以你能告诉一下吗?跨度> @AskQuestionsP:嗯,你不能运行子程序,你只能运行一个程序,所以你需要将你的程序复制到远程机器上,然后以它运行的方式调用它您要运行的子程序。【参考方案2】:

四个问题:

ssh 接受一个 shell 命令,而不是 Perl 代码。 代码不在机器上的任何位置,因此它不可能执行所需的代码。 您不能从命令行执行子例程,只能执行程序。 更改另一个进程中的变量,尤其是不同机器上的变量,不会对不同进程中的变量产生任何影响。
use String::ShellQuote qw( shell_quote );

my $perl_code = <<'__EOS__';
my $var = "32";
print $var;
__EOS__

my $remote_cmd = shell_quote( "perl", "-e", $perl_code );

my $local_cmd = shell_quote( "ssh", "machinewin10", $remote_cmd );

my $var = `$local_cmd`;

这假设远程机器使用sh 或类似的。机器的名称是machinewin10,这不是给定的。如果不是这种情况,请根据需要调整远程命令。 Win32::ShellQuote 可能有用。

同样,这假设本地计算机是 unixy,其中 systemreadpipe(反引号)使用 sh。如果不是这种情况,请根据需要调整本地命令。

【讨论】:

以上是关于如何在远程主机上调用 perl 子例程(可能通过系统命令)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 子例程中处理已捕获和未捕获的错误?

调用 perl 子例程

什么时候应该使用 & 来调用 Perl 子例程?

将参数传递给 Perl 子例程时,是不是会影响数据复制性能?

如何使用 Doxygen 和 Doxygen::Filter::Perl 为 Perl 子例程生成文档?

如何在Perl子例程中使用$ a和$ b