2012-01-20 36 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] 

请注意,使用#{...}语法(类似于双引号字符串文本)这个语法的支持红宝石表达式插值。