使用Fabric远程交互式Shell时,按下CTRL-C会导致程序终止。

4
我已经创建了一个Fabric fabfile,并编写了一个简单的任务,以便为我提供远程交互式Shell:
def shell():
  open_shell()

为了节省打字时间,我使用这种方式代替原始的ssh连接:每个远程配置都已经在fabfile中设置好了密钥路径、主机名等信息。

调用:

fab shell

这个命令可以正常工作,但是如果我在shell中按下CTRL+C,它会终止整个连接。

有没有可能使CTRL+C进入远程交互式shell呢?


1
注意:从fabric 1.6开始,默认已经修复了这个问题。有一个环境变量可以控制它 - http://docs.fabfile.org/en/1.8/usage/env.html#remote-interrupt - Nils
1个回答

2

我所见过的Python SSH库中,唯一使用SSH RFC所描述的信号传递机制的是来自chilkatsoft的这个库。

RFC 4254中提到:

6.9.  Signals

A signal can be delivered to the remote process/service using the
following message.  Some systems may not implement signals, in which
case they SHOULD ignore this message.

  byte      SSH_MSG_CHANNEL_REQUEST
  uint32    recipient channel
  string    "signal"
  boolean   FALSE
  string    signal name (without the "SIG" prefix)

'signal name' values will be encoded as discussed in the passage
describing SSH_MSG_CHANNEL_REQUEST messages using "exit-signal" in
this section.

你可以修改fabric,使用它代替'ssh'库,并添加信号处理程序以捕获SIGINT并调用SendReqSignal()将其发送到远程进程。
或者你可以只需使用stty调用将INTR字符更改为其他内容,然后再将其更改回来即可包装fabric。
#!/bin/sh
stty intr ^U
<whatever to invoke fabric>
stty intr ^C

RFC4254是一个正常的SSH客户端将信号转发到远程端的方式吗?有意思... - Nils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接