Если у вас нет PTY, вы не можете отправлять управляющие символы.Это может быть так же просто, как звонить request_pty
.
Мне потребовалось некоторое время, чтобы понять, в основном, потому что моя система немного сложнее - у меня запущено несколько сессий SSH, и другой поток должен вызвать завершение всех каналов, поэтому мой код выглядит примерно так:
def do_funny_things_to_server host,user
Net::SSH.start(host, user) do |ssh|
@connections << ssh
ssh.open_channel do |chan|
chan.on_data do |ch, data|
puts data
end
# get a PTY with no echo back, this is mostly to hide the "^C" that
# is otherwise output when I interrupt the channel
chan.request_pty(modes: [ [ Net::SSH::Connection::Term::ECHO, 0] ])
chan.exec "tail -f /some/log/file"
end
ssh.loop(0.1)
@connections.delete ssh
end
end
def cancel_all
@connections.each do |ssh|
ssh.channels.each do |id,chan|
chan.send_data "\x03"
end
end
end
Rant:
Существует так мало документации о том, как использовать request_pty
параметры, что можно сказать, что она не существует.Я должен был выяснить modes:
, прочитав источник net-ssh
и SSH RFC и рассыпав некоторые образованные предположения о значении слова "флаги" в разделе 8 RFC..
Кто-то указал в еще один важный (хотя и не относящийся к Ruby) ответ , что есть сообщение "signal"
, которое можно использовать для отправки сигналов через соединение SSH, но также и то, чтоOpenSSH (реализация, которую я использую для сервера) не поддерживает его.Если ваш сервер поддерживает его, вы можете попробовать использовать его следующим образом:
channel.send_channel_request 'signal', :string, 'INT'
См. Сообщение канала "signal"
в RFC и источнике buffer.rb
.файл , чтобы понять параметры.Вставьте сюда ожидаемую напыщенную речь о полном отсутствии документации о том, как использовать send_channel_request
.Вышеприведенное предложение в основном предназначено для того, чтобы лично описать, как использовать этот метод.
В ответе, связанном выше, также упоминается расширение SSH под названием "break"
, которое предположительно поддерживается OpenSSH, но я не смог заставить его работатьпрервать сеанс.