我想在遠程主機上呼叫 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”。
對此的幫助將不勝感激。
先感謝您!
uj5u.com熱心網友回復:
這似乎是一個XY 問題。你試圖做的事情沒有多大意義。我們或許可以提出更好的方法,但我們需要更多關于該問題的背景資訊。
您將此字串傳遞給system():
ssh machinewin10 "&simUpdate "
這用于ssh連接到“machinewin10”并運行命令“&simUpdate”。'&' 對遠程機器的 shell 有特殊意義(它將前面的命令作為后臺行程運行 - 但沒有前面的命令)并且錯誤訊息告訴你simUpdate那臺機器上沒有命令- 這應該不足為奇.
我可以想到您可能想要在這里做的兩件事。
您可能希望simUpdate()回傳一個字串,其中包含要在遠程計算機上運行的命令。在這種情況下,您不能從帶引號的字串內部呼叫子例程。你需要這樣的東西:
sub simUpdate {
return 'some_command';
}
sub sshToUpdateSim {
system ("$sshCmd machinewin10" . simUpdate());
}
或者,您可能實際上想要在遠程機器上運行子例程。如果沒有相當多的作業,那是行不通的。您不能只從命令列運行子例程。您需要將包含您的子例程的程式安裝到遠程機器上,然后從您的ssh呼叫中運行該程式,向它傳遞引數以使其運行所需的子例程。在不知道它對您有用的情況下,我沒有時間為此選項提供完整的解決方案。
總而言之,正如我在本答案開頭所說,您需要向我們提供更多有關您在此處嘗試執行的操作的詳細資訊。
哦,還有一件事。自從 Perl 5 于 1994 年發布以來,我們就不需要在 Perl 子例程呼叫上使用&符號。它仍然有效(如您所見),但這通常是一個壞主意,因為它看起來不像子例程呼叫并且可以有奇怪的副作用。有關更多詳細資訊,請參閱子程式和與號。
uj5u.com熱心網友回復:
四個問題:
- 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. 如果不是這種情況,請根據需要調整本地命令。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/379332.html
