如何在Ruby中以root身份运行命令

时间:2015-11-21 22:03:25

标签: ruby-on-rails ruby rubygems net-ssh

我在Ruby中使用net / ssh gem。 通过以下代码,我可以从本地计算机进入服务器。但我想通过输入 ROOT 来执行服务器上的命令。 通常,我通过命令

ROOT 进入服务器
sudo su -

以下是我的代码。

require 'rubygems'
require 'net/ssh'

list_of_servers = "servers.csv"
username="XYZ"
IO.readlines(list_of_servers).each do |line|
        line.chomp!
        server = line.split(',')[0]
        password = line.split(',')[1]
puts "---- " + server

Net::SSH.start(server, username, :password => password,:verbose => Logger::DEBUG) do |ssh|

result=ssh.exec!("sudo su -")
puts result
end
end

输入服务器后输出。

D, [2015-11-21T21:48:26.005576 #56654] DEBUG -- io[3fce29cc9548]: received packet nr 15 type 97 len 12
I, [2015-11-21T21:48:26.005628 #56654]  INFO -- net.ssh.connection.session[3fce29ce9834]: channel_close: 0
D, [2015-11-21T21:48:26.005796 #56654] DEBUG -- io[3fce29cc9548]: queueing packet nr 11 type 97 len 28
sudo: no tty present and no askpass program specified

注意:

我可以从本地计算机成功登录服务器,但我无法运行 ROOT命令(sudo su - )

2 个答案:

答案 0 :(得分:0)

你必须为那个

开始tty
scenario = []
scenario << ""
scenario << "su" 

@session = Net::SSH.start(ip , user,
      :password => pass,
      :auth_methods => ['password'],
      :timeout => 10
    )



@session.open_channel do |channel|
  channel.request_pty do |ch, success|
    ch.send_channel_request("shell") do |shell, success|
      shell.on_data do |c, data|
        @output << data
      end
      scenario.each do |s|
         cmd = "#{s}\r\n"
         shell.send_data(cmd)
      end
    end
  end
end

答案 1 :(得分:0)

根据man sudo,如果您在命令之前指定-Ssudo将从 stdin 获取密码。

我在终端和ruby上尝试了这一点并取得了成功:

(在下面的通用示例中插入您的密码和您希望运行的命令。)

echo "password" | sudo -S "command" 

适合我。