2016-06-28 2 views
1

Вот как на данный момент я посылать команды на удаленный сервер:Sudo через сеть :: SSH рубина

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

Как бы я выполнить команду, которая требует корень, то есть «Sudo APT-получить установку для пример ", который заставляет меня каждый раз вводить пароль?

+0

Как насчет того, чтобы сделать 'sudo su'' первым? –

+0

@ Джордан, это разные серверы. Как это мне поможет? 'sudo su -' on на 1-м сервере не будет влиять на удаленный. –

+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 

Для некоторых ссылок, вы можете проверить this вопрос о том, как использовать Sudo с паролем в качестве параметра.

Надеется, что это помогает:)

0

Если у вас есть права администратора на удаленном сервере, я бы настроить sudoers, чтобы позволить пользователю вы используете для SSH запустить беспарольную Судо. Вы можете быть в курсе тех команд, которые вы хотите разрешить без пароля. С точки зрения безопасности ваш 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