我在Ruby中使用net / ssh gem。 通过以下代码,我可以从本地计算机进入服务器。但我想通过输入 ROOT 来执行服务器上的命令。 通常,我通过命令
以 ROOT 进入服务器sudo su -
以下是我的代码。
require 'rubygems'
require 'net/ssh'
list_of_servers = "servers.csv"
username="XYZ"
IO.readlines(list_of_servers).each do |line|
line.chomp!
server = line.split(',')[0]
password = line.split(',')[1]
puts "---- " + server
Net::SSH.start(server, username, :password => password,:verbose => Logger::DEBUG) do |ssh|
result=ssh.exec!("sudo su -")
puts result
end
end
输入服务器后输出。
D, [2015-11-21T21:48:26.005576 #56654] DEBUG -- io[3fce29cc9548]: received packet nr 15 type 97 len 12
I, [2015-11-21T21:48:26.005628 #56654] INFO -- net.ssh.connection.session[3fce29ce9834]: channel_close: 0
D, [2015-11-21T21:48:26.005796 #56654] DEBUG -- io[3fce29cc9548]: queueing packet nr 11 type 97 len 28
sudo: no tty present and no askpass program specified
注意:
我可以从本地计算机成功登录服务器,但我无法运行 ROOT命令(sudo su - )。
答案 0 :(得分:0)
你必须为那个
开始ttyscenario = []
scenario << ""
scenario << "su"
@session = Net::SSH.start(ip , user,
:password => pass,
:auth_methods => ['password'],
:timeout => 10
)
@session.open_channel do |channel|
channel.request_pty do |ch, success|
ch.send_channel_request("shell") do |shell, success|
shell.on_data do |c, data|
@output << data
end
scenario.each do |s|
cmd = "#{s}\r\n"
shell.send_data(cmd)
end
end
end
end
答案 1 :(得分:0)
根据man sudo
,如果您在命令之前指定-S
,sudo
将从 stdin 获取密码。
我在终端和ruby上尝试了这一点并取得了成功:
(在下面的通用示例中插入您的密码和您希望运行的命令。)
echo "password" | sudo -S "command"
适合我。