Ruby - Проблемы с Expect и Pty
Вопрос
Я пытаюсь написать скрипт Ruby, который будет подключаться по ssh к серверу, запускать заданную команду и извлекать из нее выходные данные.Вот что у меня получилось на данный момент, в основном адаптированное из Программирование на Ruby книга:
require 'pty'
require 'expect'
$expect_verbose = true
PTY.spawn("ssh root@x.y") do |reader, writer, pid|
reader.expect(/root@x.y's password:.*/)
writer.puts("password")
reader.expect(/.*/)
writer.puts("ls -l")
reader.expect(/.*/)
answer = reader.gets
puts "Answer = #{answer}"
end
К сожалению, все, что я получаю в ответ, это:
Answer = .y's password:
Есть идеи, что я сделал не так и как облегчить это?
Решение
Для этого я рекомендую использовать net-ssh gem: sudo gem install net-ssh
: http://net-ssh.rubyforge.org/ssh/v2/api/index.html
Код выглядит примерно так:
require 'rubygems'
require 'net/ssh'
Net::SSH.start('your-server', 'username', :password => "password") do |ssh|
puts ssh.exec!("ls -la")
end
Другие советы
Проверьте http://www.42klines.com/2010/08/14/what-to-expect-from-the-ruby-expect-library.html - в нем есть несколько хороших примеров использования PTY с ожиданием Ruby и без него.
Мне часто бывает проще использовать только PTY, так как я могу посмотреть на свой "буфер" и понять, что происходит.