以下是我将命令发送到远程服务器的时刻:
def obj.__send__(*args,&blk)
Object.instance_method(:send).bind(self).call(*args,&blk)
end
我如何执行一个需要root的命令,即" sudo apt-get install例如"让我每次都输入密码?
答案 0 :(得分:0)
您需要知道远程计算机的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
有关参考,您可以查看this有关如何使用sudo作为参数的问题。
希望有所帮助:)
答案 1 :(得分:0)
如果您在远程服务器上拥有root权限,我会设置sudoers以允许您用于ssh的用户运行无密码sudo。您可以非常具体地了解您想要在没有密码的情况下允许的命令。在安全性方面,您的ssh密钥应提供比密码更好的身份验证级别。
如果您不控制服务器,要求管理员允许您在没有密码的情况下进行sudo会很麻烦,Net::SSH documentation给出了一个如何响应密码提示的简洁示例:
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