2012-01-20 62 views
3

我有一個rake任務運行,代碼很多。最後,我需要使用sftp和ssh來做一些事情。目前我無法將其自動化。有沒有辦法傳遞給標準輸出?如何將變量從ruby傳遞到sh命令

這似乎是一個簡單的問題,但我無法找到答案的任何地方

#some ruby code 
#more ruby code 
sh "sftp [email protected]" #this opens the sftp console 
sh "put file" #this doesn't get run until sftp is exited 
sh "put another_file" #neither does this 

#more ruby code 
sh "ssh host" # opens the ssh console 
sh "some_action_on_host" # this doesn't get run until ssh is exited  

我知道會有用紅寶石做SFTP和SSH的方式,但最好我只是希望能夠管變量和命令進入控制檯

+0

試圖通過命令行驅動SSH會話比使用[Net :: SSH]更多的工作(http://net-ssh.github.com/ssh/v2/ api/index.html)模塊,因爲終端和命令行的交互性,除非您一次發送單個命令。 Net :: SSH提供了相當多的控制權。 –

回答

4

所以你想運行sftp併發送一系列命令給它?怎麼樣這樣的事情:

sftp = IO.popen("sftp [email protected]", "w+") 
sftp << "put file\n" 
sftp << "put another file\n" 
sftp.flush # make sure to include this 
0

如果你不想使用ruby,那麼你可能想把你的shell命令封裝在`(反引號字符)中。該字符串將被傳遞給Kernel.`方法。該方法執行文本作爲OS外殼命令並返回作爲字符串的命令的輸出,例如:

`ls` 

替代語法爲`是%x[]。這樣,你可以寫任何bash腳本:

%x[sftp [email protected] <<COMMAND 
    put #{file} 
    quit 
COMMAND] 

請注意,使用#{...}語法(類似於雙引號字符串文本)這個語法的支持紅寶石表達式插值。