2014-02-21 39 views
0

我有點卡在這裏我想ssh進入一臺機器,然後運行大約3個命令,這些命令基本上是設置命令,然後我想用該機器的env變量返回到我的機器關於使用perl運行多個ssh命令

setup1 
setup2 
setup3 
env > envtext.txt. 
return back 

這一切我都得在Perl做

我試圖像 system("ssh @machine command1 && command 2")行不通的命令

有沒有像?

system("ssh @machine command1 -cmd command 2 -cmd command 3") 

如果不是比什麼是做 喜歡做一個shell腳本,然後調用它或我能做到這一點在Perl本身沒有任何shell腳本的最佳方式?

代碼

#!/usr/bin/perl -w 

use Net::SSH::Perl; 


my $host = "address"; 
my $user = "name"; 
my $password = "password"; 

- 建立一個新的連接

my $ssh = Net::SSH::Perl->new($host, 
    debug=>0, 

    identity_files => ['path to key'], 
      options=> ["StrictHostKeyChecking no"] 
      #interactive => yes, 
    ); 

- 認證

$ssh->login($user,$password); 

- 執行命令

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

print $stdout;` 

錯誤它給的權限是在ssh.pl行否認25

謝謝

回答

0

我想你的問題是關於SSHshing到單個遠程主機和在那裏運行多個命令。如果這是真的,那麼你需要將你的多個命令打包到遠程shell可以執行的單個命令行中。要做到這一點,最簡單的方法是使用的system的列表形式,並傳遞命令行作爲一個參數:

system "ssh", "machine", "setup1; setup2; setup3"; 

到您問題的第二部分:你想獲得的數據從遠程後臺側。爲此,您需要程序讀取SSH的輸出,而不是使用system。爲此,您可以使用:

open my $FH, "-|", "ssh", "machine", "setup1; setup2; setup3; env"; 
my @lines_from_ssh = <$FH>; 
close $FH; 

如果您還需要將輸入發送到遠程端,請查看IPC :: Open2。如果您需要捕獲stdout和stderr,請參閱IPC :: Open3。

+0

我能夠發送命令,但我現在的問題是,我得到相同的env變量文件,setup1給出一個文件設置2給出另一個env變量文件都相同,但兩者應該是不同的。 – user3338189

+0

我不太理解你的評論,但這聽起來像是一個不同的問題。由於您無法將多個命令發送到遠程服務器,因此您是否介意接受此答案並針對您的下一個問題詢問新問題? – smammy

+0

我的意思是說,我得到的env變量文件是setup1之後的那個文件,而不是setup2之後我已經在setup2之後保留了env> envtest.txt,但是仍然得到了具有第一個文件的env變量的文件 – user3338189

0

你可以做什麼:

system("ssh $_ command1 -cmd command 2 -cmd command 3") for @machines; 

另一個純Perl代碼解決方案是使用Net::OpenSSH

+0

我試過使用NET :: SSH :: PERL它說權限被拒絕我給了鑰匙的位置仍然說拒絕,但交互模式工作,但批模式不是。任何想法爲什麼 – user3338189

+0

更好地添加代碼和錯誤在您原來的POST –

+0

我說**在您的原始POST **:http:// stackoverflow。com/posts/21940610 /編輯 –