如何在远程主机上调用 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,其中 system
和 readpipe
(反引号)使用 sh
。如果不是这种情况,请根据需要调整本地命令。
【讨论】:
以上是关于如何在远程主机上调用 perl 子例程(可能通过系统命令)?的主要内容,如果未能解决你的问题,请参考以下文章
将参数传递给 Perl 子例程时,是不是会影响数据复制性能?