Отправьте ctrl-c на канал в рубиновой сети Net :: SSH - PullRequest
0 голосов
/ 14 сентября 2018

более старая версия Net :: SSH имела #send_signal.Поскольку этот метод, по-видимому, больше недоступен, попытался отправить «\ cC» через #send_data, а также попытался закрыть канал, но удаленная команда продолжает выполняться.

Как правильно отправлять сигналы наNet :: SSH :: Канал сейчас?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Если у вас нет 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, но я не смог заставить его работатьпрервать сеанс.

0 голосов
/ 14 сентября 2018

Вы хотите использовать request_pty для создания псевдо-терминала. Вы можете использовать этот терминал для отправки команды прерывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...