Как я могу выполнить эквивалент взаимодействия Expect в Ruby?

Я хочу создать сеанс SSH, ответить на запрос пароля для входа в систему, а затем взаимодействовать с удаленной системой. Это легко сделать с помощью Expect, но мне сложно сделать это в Ruby.

В Expect я бы просто сделал что-то вроде:

log_user 0
spawn ssh user@host
expect "assword" { send "my_password\r" }
interact

Однако Ruby IO# метод expect не обеспечит интерактивности, которая мне нужна. Я также читаю документацию по Net::SSH. , но не нашел очевидного способа сделать сеанс интерактивным после успешного входа в систему.

После того, как соединение будет успешно открыто, что необходимо для того, чтобы сделать TTY/PTY на удаленном узле интерактивным?


person Todd A. Jacobs    schedule 05.03.2019    source источник
comment
Я действительно надеюсь, что это может получить ответ, а также.   -  person Steven Hepting    schedule 05.05.2021


Ответы (2)


Если вы еще этого не сделали, установите гем net-ssh в командной строке.

gem install net-ssh

Вот фрагмент кода, который обрабатывает аутентификацию SSH, а затем подключается к IP-адресу любого удаленного хоста, который вы выберете.

#!/usr/bin/env ruby
require 'rubygems'
require 'net/ssh'
HOST = '192.168.1.113'
USER = 'username'
PASS = 'password'

Net::SSH.start( HOST, USER, :password => PASS ) do|ssh|
result = ssh.exec!('ls')
puts result
end

После подключения к удаленному хосту сеанс должен быть «интерактивным», но, насколько я понимаю, это не эквивалент Expect's Interact. Вот пара ссылок, которые охватывают встроенные в Ruby модули TTY и PTY: https://piotrmurach.github.io/tty/ http://ruby-doc.org/stdlib-2.6.1/libdoc/pty/rdoc/PTY.html. Вам нужно будет выполнить еще одну команду gem install на терминале Ruby для TTY.

person Max Voisard    schedule 05.03.2019
comment
AFAICT, это запустит ls на удаленном хосте, но не даст мне стандартный ввод или стандартный вывод на моем локальном терминале. Если это правда, то это не решает проблему, которую я пытаюсь решить. - person Todd A. Jacobs; 05.03.2019

Я не могу комментировать, поэтому публикую как ответ, так как делаю то же самое с помощью утилиты sshpass (если у вас ее нет, вы можете легко установить)

#!/bin/ksh
IP=yourIP
ping -c 1 $IP 
if [ $? -gt 0 ]
 then
 echo "$IP not reachable." 
 exit
else
 echo "$IP is reachable"
fi
sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no username@$IP

если вы хотите записать вывод сеанса, вы можете передать вывод в файл журнала, используя команду tee, например sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no username@$IP | tee -a logfile.log

person Ibraheem    schedule 06.03.2019