Я искал способ запустить интерактивную команду (например, ssh
) и записать ее вывод.Это звучит просто, но, насколько я понимаю, мой вариант использования немного отличается от многих результатов Google и S / O.
Чтобы быть понятным, под интерактивным я имею в виду пользователя, который запускает my_ruby_script.rb
изтерминал должен иметь возможность
- вводить (
stdin
) команду работающей интерактивной системы (например, вводить ls
через ssh
туннель) - считывать из (
stdout
/ stderr
) запущенная интерактивная системная команда (опять же, например, просмотр результата ls
в туннеле ssh
)
Кроме того, я хотел бы прочитатьвывод системной команды (ssh
), поэтому я могу, например, проверить наличие ошибок внутри моего скрипта Ruby.Самое близкое, что я получил, это просто tee
вывод в другой файл.
system('ssh username@ssh_server |& tee ssh_log.txt')
Это не идеально, так как
- Это требует сохранения в / чтения изотдельный файл
- Требуется более сложный системный вызов, который может быть или не быть переносимым
Насколько я понимаю, большинство решений в сети (backticks, Open3.*
, PTY.spawn()
и т. д.) перенаправьте stdin / stdout из интерфейса терминала в программу ruby.То, что я ищу - это оставить stdin
в покое и использовать stdout
для моего сценария на Ruby.У кого-нибудь есть идеи?
Я должен отметить, что system('ssh username@ssh_server')
делает именно то, что я хочу, мне просто нужно иметь возможность прочитать вывод.Кроме того, я бы предпочел не использовать net-ssh и другие библиотеки, не относящиеся к stdlib.
Research:
- Это, пожалуй, самая полная страница, описывающая выполнение команд в Ruby ( Когда использовать каждый метод запуска подпроцесса в Ruby и связанные сообщения в блоге).
- У этих людей (как мне кажется) моя точно такая же проблема:
- Эти люди используют ssh через Ruby, но их сценарии не являются "интерактивными"
Я очень ценю любые идеи, которые вы можете предоставить.