2010-09-08 70 views
4

我有以下腳本:如何在同一ssh會話中執行2個或多個命令?

#!/usr/bin/env ruby 
require 'rubygems' 
require 'net/ssh' 

Net::SSH.start('host1', 'root', :password => "mypassword1") do |ssh| 
    stdout = "" 

    ssh.exec("cd /var/example/engines/") 
    ssh.exec!("pwd") do |channel, stream, data| 
     stdout << data if stream == :stdout 
    end 
    puts stdout 

    ssh.loop 
end 

,我也得到/root,而不是/var/example/engines/

+0

我有一個小的相關問題的SSH紅寶石。請幫助我 - https://stackoverflow.com/questions/28799593/unix-commands-work-on-server-but-not-in-ruby-ssh-session – james 2015-03-01 22:00:22

+0

太簡單'Net :: SSH'不能執行隨機腳本。它在我看來,它以某種方式吃新的線,並且bash不能正常工作......用';'拼接行不起作用,因爲註釋在它們後面渲染無效任何命令 – akostadinov 2015-03-19 15:18:41

回答

1

看看是否有什麼東西類似於文件(utils的?)CD塊語法,否則只是在同一子shell,例如運行命令ssh.exec「cd/var/example/engines /; pwd」?

+0

請注意,在加入多個用於'system'調用的命令時,分號(;)可能無法在Windows中工作,即,您應該使用'sysetm「cd/var/example/engines/&& pwd' – 2013-01-28 09:14:06

2
ssh.exec("cd /var/example/engines/; pwd") 

將執行cd命令,然後在新目錄中pwd命令。

我不是一個紅寶石的傢伙,但我會猜測有可能是更優雅的解決方案。

1

我不是一個紅寶石程序員,但你可以嘗試連接你的命令;或& &

2

In Net :: SSH,#exec & #exec!是相同的,例如,他們執行一個命令(除了exec!阻塞其他調用的例外,直到它完成)。關鍵要記住的是,當使用exec/exec!時,Net :: SSH實質上運行用戶目錄中的每個命令。因此,在您的代碼中,您從/root目錄運行cd /some/path,然後運行pwd - 再次從/root目錄運行。

我知道如何按順序運行多個命令最簡單的方法是將它們鏈接在一起,如& &(如上面其他海報所述)。因此,這將是這個樣子:

#!/usr/bin/env ruby 
require 'rubygems' 
require 'net/ssh' 

Net::SSH.start('host1', 'root', :password => "mypassword1") do |ssh| 
    stdout = "" 

    ssh.exec!("cd /var/example/engines/ && pwd") do |channel, stream, data| 
     stdout << data if stream == :stdout 
    end 
    puts stdout 

    ssh.loop 
end 

不幸的是,淨:: SSH shell service的版本中刪除2.

+0

我有一個小的相關問題的SSH紅寶石。請幫助我 - https://stackoverflow.com/questions/28799593/unix-commands-work-on-server-but-not-in -ruby-ssh-session – james 2015-03-01 21:59:12

+0

James,對不起,我還沒有登錄過SO,但是這看起來像是正確答案:http://stackoverflow.com/a/28800048/387135 – Brian 2015-03-10 14:52:40

1

有曾經有一個Shell服務,允許有狀態的命令,就像你試圖做在網絡/ ssh v1中,但它已在v2中刪除。然而,net/ssh的作者有一個側面項目可以讓你做到這一點。看看這裏:http://github.com/jamis/net-ssh-shell

0

net-ssh-shell is changed.

當前位置我決定使用雖然叫隨機shell腳本是一個文件到遠程機器和源SCP的它進入外殼。基本上這樣做: File.write(script_path, script_str) gear.ssh.scp_to(script_path, File.dirname(script_path)) gear.ssh.exec(". script_path")

2

你可以給不同的命令分隔一個新行。喜歡的東西:

@result = ssh.exec!("cd /var/example/engines/ 
        pwd 
        ") 
puts @result 

它可能更容易(更清晰)將命令傳遞給一個變量,然後傳遞變量爲exec。同樣的原則。

+1

這是Ruby的最佳答案net-ssh寶石。 – 2015-10-19 15:53:27

相關問題