В предыдущем вопросе Я выяснил, как запустить сеансы SSH с аутентификацией по паролю на нескольких серверах для запуска одной команды. Теперь мне нужно выполнить команду sudo. Проблема в том, что net-ssh-multi не выделяет псевдотерминал (pty), который необходим для запуска sudo, что приводит к следующей ошибке:
[127.0.0.1: stderr] sudo: извините, у вас должен быть tty для запуска sudo
Согласно документации , псевдотерминал может быть выделен с помощью вызова метода для объекта канала, однако следующий код не работает: он генерирует ошибку «no tty» выше:
require 'net/ssh'
require 'net/ssh/multi'
Net::SSH::Multi.start do |session|
# define the servers we want to use
my_ticket.servers.each do |session_server|
session.use session_server , :user => user_name , \
:password => user_pass
end
# execute commands on all servers
session.exec 'sudo ls /root' do |channel, stream, data|
if data =~ /^\[sudo\] password for user:/
channel.request_pty # <- problem must be here.
channel.send_data user_pass
end
end
# run the aggregated event loop
session.loop
end
$ ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]