Я пытаюсь написать некоторый код ruby, который мог бы подключиться к консоли виртуальных машин XenServer (через /usr/lib/xen/bin/xenconsole
), сначала подключившись по SSH к серверу хоста, а затем получив доступ к консоли виртуальных машин из командной строки.
Для этого я использую библиотеку ruby Net::SSH
. Я делаю хорошо, входя в хост-сервер через SSH и запускаю команды, чтобы получить идентификатор DOM виртуальной машины. Проблема возникает, когда я запускаю команду xenconsole. Вы должны нажать «enter» после команды, чтобы получить дамп в консоль, затем вы должны нажать CTRL + ]
, чтобы выйти из консоли виртуальной машины и вернуться к командной строке хоста.
Я использую приведенный ниже код, но он зависает в точке «нажми ввод» и не дает никакой обратной связи от канала SSH как STDOUT или STDERR. Что я могу сделать, чтобы получить доступ к консоли виртуальной машины для выполнения команд на виртуальной машине? Тогда как мне отправить CTRL + ]
символов?
def execute_remote_console(hostname, port, username, password, uuid)
begin
Net::SSH.start( hostname, username, :password => password, :port => port ) do |session|
dom_list_line = session.exec! "list_domains | grep #{uuid}"
if dom_list_line.match(/(\d+)/)
dom_id = $1
puts "found #{uuid} on DOM #{dom_id}"
else
raise "couldn't find DOM id"
end
console_command = "/usr/lib/xen/bin/xenconsole #{dom_id}"
puts "connecting to console: #{console_command}"
session.exec!( console_command ) do |ch,stream,data|
puts "pressing (enter)"
ch.send_data "\n"
case stream
when :stderr
puts "E-> #{data}"
ch.exec "cat /etc/hostname" do |chan, success|
raise "could not execute command" unless success
# "on_data" is called when the process writes something to stdout
chan.on_data do |c, data|
$STDOUT.print data
end
# "on_extended_data" is called when the process writes something to stderr
chan.on_extended_data do |c, type, data|
$STDERR.print data
end
chan.on_close { puts "done!" }
end
when :stdout
puts "O-> #{data}"
else
puts" other: #{data}"
end
end #end session.exec
end #end SSH.start
rescue
puts "\t\t\tok (#{$!.message})"
end
end #end function