ruby中通过net::ssh实现Sudo

ruby中通过net::ssh实现Sudo,ruby,linux,ssh,sudo,Ruby,Linux,Ssh,Sudo,下面是我目前如何向远程服务器发送命令: Net::SSH.start("1.2.3.4", keys: ["~/.ssh/id_rsa.pub"]) do |ssh| ssh.exec!(cmd_item) end 我如何执行一个需要root用户的命令,即“sudo apt get install example”,让我每次都输入密码?您需要知道远程机器的root用户密码。如果这是已知的,那么剩下的应该可以通过以下方式实现: Net::SSH.start("1.2.3.4", keys:

下面是我目前如何向远程服务器发送命令:

Net::SSH.start("1.2.3.4", keys: ["~/.ssh/id_rsa.pub"]) do |ssh|
  ssh.exec!(cmd_item)
end

我如何执行一个需要root用户的命令,即“sudo apt get install example”,让我每次都输入密码?

您需要知道远程机器的root用户密码。如果这是已知的,那么剩下的应该可以通过以下方式实现:

Net::SSH.start("1.2.3.4", keys: ["~/.ssh/id_rsa.pub"]) do |ssh|
   if not cmd_item["sudo "].nil? # if cmd_item string requires sudo access
       # sudo yourcommand  =>  echo -e "RemoteRootPassword\n" | sudo -S yourcommand
       cmd_item = "echo -e \"RemoteRootPassword\n\" | " + cmd_item.gsub(/sudo/, "sudo -S")
       ssh.exec!(cmd_item)
   else
       ssh.exec!(cmd_item)
   end
end
作为参考,您可以查看关于如何使用sudo和password作为参数的问题


希望有帮助:)

您需要知道远程计算机的根密码。如果这是已知的,那么剩下的应该可以通过以下方式实现:

Net::SSH.start("1.2.3.4", keys: ["~/.ssh/id_rsa.pub"]) do |ssh|
   if not cmd_item["sudo "].nil? # if cmd_item string requires sudo access
       # sudo yourcommand  =>  echo -e "RemoteRootPassword\n" | sudo -S yourcommand
       cmd_item = "echo -e \"RemoteRootPassword\n\" | " + cmd_item.gsub(/sudo/, "sudo -S")
       ssh.exec!(cmd_item)
   else
       ssh.exec!(cmd_item)
   end
end
作为参考,您可以查看关于如何使用sudo和password作为参数的问题


希望有帮助:)

如果您在远程服务器上拥有root权限,我会设置sudoers,以允许您用于ssh的用户运行无密码sudo。您可以非常具体地说明您希望在不使用密码的情况下允许使用的命令。就安全性而言,ssh密钥应该提供比密码更好的身份验证级别

如果您无法控制服务器,并且要求管理员允许您在不使用密码的情况下使用sudo会很麻烦,则提供了一个简单的示例,说明如何响应密码提示:

Net::SSH.start("host", "user") do |ssh|
  ssh.exec! "cp /some/file /another/location"
  hostname = ssh.exec!("hostname")

  ssh.open_channel do |ch|
    ch.exec "sudo -p 'sudo password: ' ls" do |ch, success|
      abort "could not execute sudo ls" unless success

      ch.on_data do |ch, data|
        print data
        if data =~ /sudo password: /
          ch.send_data("password\n")
        end
      end
    end
  end

  ssh.loop
end

如果您在远程服务器上具有root权限,我将设置sudoers,以允许您用于ssh的用户运行无密码sudo。您可以非常具体地说明您希望在不使用密码的情况下允许使用的命令。就安全性而言,ssh密钥应该提供比密码更好的身份验证级别

如果您无法控制服务器,并且要求管理员允许您在不使用密码的情况下使用sudo会很麻烦,则提供了一个简单的示例,说明如何响应密码提示:

Net::SSH.start("host", "user") do |ssh|
  ssh.exec! "cp /some/file /another/location"
  hostname = ssh.exec!("hostname")

  ssh.open_channel do |ch|
    ch.exec "sudo -p 'sudo password: ' ls" do |ch, success|
      abort "could not execute sudo ls" unless success

      ch.on_data do |ch, data|
        print data
        if data =~ /sudo password: /
          ch.send_data("password\n")
        end
      end
    end
  end

  ssh.loop
end

先做sudo su-怎么样?@Jordan,那是不同的服务器。这对我有什么帮助<第一台服务器上的code>sudo su-对远程服务器没有影响。我没有说要在本地计算机上执行。你的问题让我相信你的意思是在同一个SSH会话中“每次”。如果不是这样的话,你应该澄清你的问题。@Jordan不,我不应该。可能是重复的,先做
sudo su-
怎么样?@Jordan,那是不同的服务器。这对我有什么帮助<第一台服务器上的code>sudo su-对远程服务器没有影响。我没有说要在本地计算机上执行。你的问题让我相信你的意思是在同一个SSH会话中“每次”。如果不是这样的话,你应该澄清你的问题。@Jordan不,我不应该。可能是重复的