2016-06-28 27 views
1

下面是如何在我命令发送到远程服务器的那一刻:须藤通过净:: SSH在Ruby中

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

我将如何执行它需要root的命令,那就是“sudo易于得到安装例如“每次有我输入密码?

+0

先做'sudo su -'怎么样? –

+0

@Jordan,那些是不同的服务器。这对我有帮助吗?第一台服务器上的sudo su - '对远程服务器不起作用。 –

+0

我没有说在本地机器上这样做。你的问题使我相信你在同一个SSH会话中“每次”都意味着什么。如果情况并非如此,你应该澄清你的问题。 –

回答

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 

对于一些参考,你可以检查有关如何为参数使用sudo与密码this问题。

希望它可以帮助:)

0

如果您在远程服务器上的root权限,我会成立sudoers文件,让您使用SSH密码的运行sudo的用户。你可以真正关注你想要允许的命令而不需要密码。就安全性而言,您的ssh密钥应该比密码提供更好的身份验证级别。

如果不能控制服务器,这将是一个麻烦问管理员,让您无需密码须藤,该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