键盘表达问题类似于 (echo -ne '\015')

键盘表达问题类似于 (echo -ne '\015')

如何表达 ( Ctrl+ a+ )以与我按以下方式使用键盘输入组合键相同的方式d安全地从会话中分离:screen

(echo -ne '\015')

我想将这些表达式放入某种脚本中,是否有 Linux 键盘按键表达式映射或类似的东西?

答案1

据我所知,没有可以在 shell 上执行的命令之内screen将您的终端与该会话分离的会话 。screen只查看输入从您的终端对于神奇的元字符(Ctrl- a),不在由管理的终端会话中显示的任何内容screen 本身。为了演示,我创建了一个名为的文件detachsequence,其中包含一个Ctrl-a字符,后跟一个d字符:

$ hexdump detachsequence
0000000 01 64

如果我catscreen会话中执行此操作,则不会发生任何(值得注意的)事情;该文件将简单地显示(尽管有不可见的控制字符):

$ cat detachsequence
d

一个echoor 也printf同样不引人注目。

事实上,如果cat其中的文件可以向自身screen发送控制序列,这将是一个特别严重的安全缺陷。screen

答案2

通用解决方案可能是:

screen -d $STY

Screen 会将会话名称传递给$STY变量,然后您就可以使用screen -d它。

您可能希望在分离时运行命令,可以这样做:

screen -d $STY & yourcommand

笔记: screen -d本身就足够了。您不需要指定$STY.

您还可以启动一个首先分离的脚本:

screen -d -m /the/script

但这需要注意的是,在脚本分离之前,您没有可以与脚本交互的时间范围。如果您需要这样做,那么前一个解决方案应该是最佳选择。

其他解决方案(取决于环境):

如果您在会话中的虚拟终端上使用脚本X,则可以利用xdotool将控制序列发送到终端:

xdotool key control+a+d

答案3

按键Ctrl-<letter>将字母Ato 的字符代码 1 到 26 发送给Z。即Ctrl-Aor ^Ais 发送字符 1,or \x01or \001, ^Bis 2 等。回车符为\015or 13(十进制) or ^M

那么,Ctrl-A d将会是\001d

但是,如果您想以某种方式发送该序列screen,则从屏幕本身内部执行此操作并不容易。 (您可以从终端执行此操作外部screen。)

要求screen从脚本分离的一种更简单的方法是运行screen -X detach,也可能使用-S来指定要分离的屏幕并使用STY环境变量来查找当前屏幕的标识。

相关内容