一个{:{3}}的Net :: SSH具有#send_signal。由于该方法似乎不再可用,请尝试通过#send_data发送“ \ cC”,并尝试关闭通道,但是远程命令将继续运行。
现在将信号发送到Net :: SSH :: Channel的正确方法是什么?
答案 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
关于如何使用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 RFC和buffer.rb
source file以了解参数。在此处插入有关完全缺少有关如何使用send_channel_request
的文档的预期说法。以上建议主要是为我自己记录如何使用此方法。
上面链接的答案还提到了一个名为"break"
的SSH扩展,据说该扩展受OpenSSH支持,但是我无法使其中断会话。