Net-SSH - слишком низкий уровень, чтобы просто обеспечить это заранее (так или иначе, в любом случае).Вы можете проверить Net-SSH-Shell, который основан на Net-SSH для добавления функциональности оболочки входа в систему: https://github.com/mitchellh/net-ssh-shell
Реализация надежна и работает, однако я нашел ее не слишком полезной, поскольку вы не можете специальноизвлекать такие вещи, как stderr или exit status, потому что команды запускаются в под-оболочке, поэтому вы можете получить только stdout.Библиотека net-ssh-shell использует некоторые хаки для получения статуса выхода.
Мне нужна «оболочка входа» для моих собственных проектов Ruby, и для этого я обычно выполняю действия непосредственно в оболочке.используя следующий код:
def execute_in_shell!(commands, shell="bash")
channel = session.open_channel do |ch|
ch.exec("#{shell} -l") do |ch2, success|
# Set the terminal type
ch2.send_data "export TERM=vt100\n"
# Output each command as if they were entered on the command line
[commands].flatten.each do |command|
ch2.send_data "#{command}\n"
end
# Remember to exit or we'll hang!
ch2.send_data "exit\n"
# Configure to listen to ch2 data so you can grab stdout
end
end
# Wait for everything to complete
channel.wait
end
В этом решении вы все равно не получите статус выхода или команды stderr, запущенные в оболочке входа, но по крайней мере команды выполняются в этом контексте.
Надеюсь, это поможет.