[英]Sudo via net::ssh in ruby
以下是我將命令發送到遠程服務器的時刻:
Net::SSH.start("1.2.3.4", keys: ["~/.ssh/id_rsa.pub"]) do |ssh|
ssh.exec!(cmd_item)
end
我如何執行一個需要root的命令,即“sudo apt-get install例如”讓我每次都輸入密碼?
您需要知道遠程計算機的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與密碼提示問題。
希望能幫助到你 : )
如果您在遠程服務器上擁有root權限,我會設置sudoers以允許您用於ssh的用戶運行無密碼sudo。 您可以非常具體地了解您想要在沒有密碼的情況下允許的命令。 在安全性方面,您的ssh密鑰應提供比密碼更好的身份驗證級別。
如果您不控制服務器並且要求管理員允許您在沒有密碼的情況下sudo將是一件麻煩事, Net :: SSH文檔提供了一個如何響應密碼提示的簡潔示例:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.