如何使用Ruby在远程服务器上运行shell命令?

时间:2012-04-04 12:36:00

标签: ruby-on-rails ruby shell sftp

Ruby脚本中是否有一种方法可以sftp到服务器并运行一些命令。

这是我的剧本

Net::SFTP.start(IP_ADDRESS, 'root', :keys => ["/Users/user/.ssh/id_rsa"]) do |sftp|
    sftp.mkdir! "/srv/new_dir"
    sftp.dir.foreach("/srv/crm/current") do |entry|
      puts entry.longname
      sftp.file.open("/srv/new_dir", "w") do |f|
        f.puts entry
      end
    end
end

基本上我试图sftp到服务器并将文件夹复制到一个新文件夹,我想重新启动apache。我试过这个:

FileUtils::sudo "/etc/init.d/apache2 reload"

但这不起作用。我有什么想法,或者这是否可能?

2 个答案:

答案 0 :(得分:1)

由于您实际上没有进行任何文件传输,我认为您不需要使用SFTP。您只需使用Net::SSH重写此脚本即可。然后您可以正常访问shell,而Apache命令只是此过程中的另一个步骤。

答案 1 :(得分:0)

我会用Capistrano来完成。

<强>更新

Capistrano专为部署rails应用程序而设计,但您可以将其用作管理远程计算机的工具。通过简单的配方,您可以完成工作。

假设你有一个这样的Capfile:

desc "sample recipe"
task :sample do
    Dir.glob('**/*') do |f|
        upload f, "tmp/#{f}" 
    end
    run 'ls -lr'
end

role :app, "host name or ip"
set :user, "user_name"

然后您可以运行cap sample上传文件并运行任何命令。

这可能过度,但比使用Net API要容易得多。