将ctrl-c发送到ruby的Net :: SSH gem

时间:2018-09-14 16:38:06

标签: ruby ssh

一个{:{3}}的Net :: SSH具有#send_signal。由于该方法似乎不再可用,请尝试通过#send_data发送“ \ cC”,并尝试关闭通道,但是远程命令将继续运行。

现在将信号发送到Net :: SSH :: Channel的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

您要使用request_pty创建一个伪终端。您可以使用该终端发送中断命令。

答案 1 :(得分:0)

除非拥有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:SSH RFC的来源来找出net-ssh,并对section 8 of the RFC中“ flags”一词的含义进行一些有根据的猜测。 / p>

有人在another relevant (though not Ruby specific) answer中指出,有一条"signal"消息可用于通过SSH连接发送信号,但是OpenSSH(我用于服务器的实现)也不支持它。如果您的服务器支持它,那么您可能想要尝试像这样使用它:

channel.send_channel_request 'signal', :string, 'INT'

请参阅"signal" channel message in the RFCbuffer.rb source file以了解参数。在此处插入有关完全缺少有关如何使用send_channel_request的文档的预期说法。以上建议主要是为我自己记录如何使用此方法。

上面链接的答案还提到了一个名为"break"的SSH扩展,据说该扩展受O​​penSSH支持,但是我无法使其中断会话。