2013-05-06 66 views
0

我想用淨:: SSH :: Perl模塊,在一個單一的線路來執行兩個命令..淨:: SSH :: Perl的模塊:執行多個命令

實際上第一命令集合的一些環境變量,第二運行某些需要爲該shell設置env變量的命令。

如何讓下面的一塊

例如代碼工作:

use Net::SSH::Perl; 
my $hostname = "<<hostname>>"; 
my $username = "<<username>>"; 
my $password = "<<password>>"; 

my $cmd = 'export PATH= *** ; java -version'; 

my $ssh = Net::SSH::Perl->new("$hostname", debug=>0); 
$ssh->login("$username","$password"); 

my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd"); 
print $stdout; 

這個問題已經問到這個網站,但目前還沒有答案。

調用$ssh->cmd幾次都不行,因爲這兩個調用不會在同一個會話中被調用。

+0

你會添加鏈接到其他問題...你可以進一步討論,而不是開始一個新的? – RacerNerd 2013-05-06 18:01:01

回答

3

舉的comprehensive Perl archive network

($出來,$ ERR,$退出)= $ SSH-> CMD($ CMD,[$ stdin中])

運行命令$ CMD上遠程服務器並返回stdout,stderr,並退出該命令的狀態。

如果提供$ stdin,則將其提供給標準輸入的 遠程命令$ cmd。

注意:SSH-1協議不支持每個連接運行多個命令 ,除非這些命令鏈接在一起,以便遠程shell可以對它們進行評估。因此,每次調用cmd時都會創建一個新的套接字 連接,並在事後處理掉 。換句話說,這樣的代碼:

my $ssh = Net::SSH::Perl->new("host1"); 
$ssh->login("user1", "pass1"); 

$ssh->cmd("foo"); 
$ssh->cmd("bar"); 

實際上將連接到的sshd上CMD的第一次調用,然後 斷開;然後在第二次調用cmd時再次連接,然後再次斷開 。

請注意,這不適用於SSH-2協議。完全支持SSH-2 支持在同一連接上運行多個命令。

所以,你有兩個選擇:

  1. 有兩個符號("cmd1 && cmd2 && cmd3 && ..."
  2. 使用SSHv2的
+0

你如何使用SSHv2? – 2014-09-26 18:42:47

1

最簡單的方式鏈接你的命令調用一些程序有一些變量設置是在命令之前放置變量定義:

VAR1=VALUE1 VAR2=VALUE2 ... cmd arg1 arg2 arg3 ... 

在你的情況下,似乎你已經擁有的變量定義在一些文件中執行如下操作:

source /path/to/scripts/that/sets/vars.sh && cmd arg1 arg2 arg3 ... 

這一工程在本地運行命令時(即通過system)或遠程通過ssh

另請注意,您可能需要在變量名稱和值以及命令名稱和參數中引用shell元字符。

-1
use Net::SSH::Perl; 
my $hostname = "<<hostname>>"; 
my $username = "<<username>>"; 
my $password = "<<password>>"; 

my $cmd1 = "source ~ur_env_paths"; 
my $cmd2 = "your next command"; 

my $ssh = Net::SSH::Perl->new("$hostname", debug=>0); 
$ssh->login("$username","$password"); 

my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd1 && $cmd2"); ## just enter ur commands and they will execute in that sequence. 

print $stdout;