掌握GNU Screen

GNU Screen是一个终端多路复用器,一个管理终端窗口的程序。它已经存在了28年,比Perl 5还要老。所以如果你认为Perl有一些过时的约定,那你还没有看到什么。但尽管如此,Screen是管理终端的一个强大工具;如果你经常需要使用多个终端,你欠自己一个开始使用多路复用器以获得重大生产力提升的理由。Screen是最广泛使用的多路复用器,另一个流行的选择是tmux,但本文将介绍Screen。
入门指南
通过在命令行中简单地输入screen
来启动Screen。
$ screen
Screen中的所有命令都以前缀Control + a
开头。首先要学习的是最重要的命令;如何显示命令菜单!为此,请输入Control + a, ?
(即,按住Control键,然后按“A”键,释放按键后输入问号)。如果你记得这个命令,你就可以随时摆脱困境,即使你忘记了其他一些命令。
管理窗口
要打开一个新的终端窗口,请输入Control + a, c
。Screen将创建一个新的窗口——这是一个新的终端进程。要查看打开的窗口列表,请输入Control + a, "
。你可以按上箭头和下箭头来突出显示你想要使用的窗口,然后按回车键打开它。
你也可以通过按Control + a, n
来移动到下一个窗口,按Control + a, p
来移动到上一个窗口。每个窗口都分配了一个数字,你可以直接跳转到窗口:Control + a, #
,其中井号键是要跳转到的窗口的数字。
最后,如果你想杀死一个窗口,请输入Control + a, k
。要杀死所有窗口并退出screen,请输入组合键:Control + a, \
分割屏幕
Screen可以将终端窗口分割成多个窗口。如果你需要同时查看多个终端,这非常有用。任何窗口都可以垂直或水平分割,并且可以多次分割,导致各种组合。要垂直分割屏幕,请输入:Control + a, |
,要水平分割,请输入:Control + a, S
。
要突出显示下一个分割窗口,请输入Control + a, tab
(还有一个配置选项可以通过鼠标点击来选择,稍后会详细介绍)。组合键Control + a, Q
将退出分割屏幕模式。
复制和粘贴
在Screen中进行复制和粘贴并不特别容易。事实上,我经常发现自己在使用终端复制和粘贴(使用鼠标突出显示,然后按Control + C
,Control + V
)。然而,了解Screen的复制和粘贴是有用的,因为终端复制和粘贴在分割屏幕模式下会崩溃,而且你可能仍然想要使用鼠标选择做一些更有用的操作。
复制和粘贴是模式化的,因此首先你必须进入“复制模式”。为此,请输入Control + a, [
。现在将光标移动到你想要复制的文本的开始。按space
来标记它,并使用箭头键(或h、j、k、l)将光标移动到你想要复制的文本的末尾。再次按space
将复制突出显示的文本。要粘贴,请输入Control + a, ]
。哎呀。
滚动
默认情况下,Screen 使用 X-Window 滚动条防止滚动(它也不保留太多历史记录)。这可能会非常令人烦恼,因此您需要了解如何滚动。要这样做,您需要使用 Control + a, [
进入复制模式,然后按 Control + u
向上滚动,按 Control + d
向下滚动。按 escape
退出复制模式。直到您能记住滚动的组合键,您会发现您将输出管道化到 less
的频率比您想象的要多。
断开 Screen 会话
Screen 会话可以像任何其他终端进程一样放入后台。Screen 将保持打开任何终端进程(如 ssh 会话)。这非常有用——如果您发现自己正在与 5 或 6 个以上的窗口一起工作,断开连接并启动一个新的 screen 会话可能比添加更多窗口更容易。要断开 screen,组合键是 Control + a, d
。当您断开连接时,screen 将打印会话名称并返回到终端提示符。要重新连接到一个已断开的会话,只需使用 screen -r
$ screen -r
如果您有多个 screen 会话,可以使用 -ls
显示所有已断开的会话
$ screen -ls
There are screens on:
30549.pts-1.localhost (Detached)
30498.pts-1.localhost (Detached)
29207.pts-1.localhost (Detached)
3 Sockets in /var/run/screen/S-sillymoose.
然后,只需通过将会话名称作为选项提供给 -r
,就可以重新连接到所需的会话
$ screen -r 29207
但如果您真的有多个 Screen 会话在运行,记住它们都在做什么可能会有点困难。所以当您启动 Screen 时,请使用 -S
选项为会话命名
$ screen -S aws_ec2
如果您为所有会话命名,就知道要重新连接到哪个会话了
$ screen -ls
There are screens on:
31155.aws_ec2 (Detached)
30866.email_servers (Detached)
30815.ecommerce_app (Detached)
3 Sockets in /var/run/screen/S-sillymoose.
$ screen -r email_servers
自定义 Screen
Screen 可以高度配置,这很好,因为您可能会想更改一些默认选项。然而,您应该考虑的第一个选项根本不是 Screen 的选项。
要停止 ssh 会话超时,请将以下内容添加到您的 ~/.ssh/config
文件中
# dont timeout connections
ServerAliveInternal 600
如果 ~/.ssh/config
文件不存在,您可能需要更改文件的权限
$ chmod 644 ~/.ssh/config
此选项将使 ssh 每隔 10 分钟向远程服务器发送一个字节,以保持会话活跃。您可能需要根据您的需求更改频率。现在您可以在 screen 内拥有多个 ssh 窗口,断开连接数小时后返回,您仍然可以登录。
像许多其他终端程序一样,screen 会查找运行配置文件(~/.screenrc
)。我喜欢以下选项
# no welcome message
startup_message off
# keep running processes on detach
autodetach on
# start windows at 1 instead of 0
bind c screen 1
bind ^c screen 1
bind 0 select 10
screen 1
# large scrollback buffer
defscrollback 5000
# on split screen, switch window focus by clicking
mousetrack on
# refresh screen after closing a program
altscreen on
有大量的选项可供选择。Screen 有一个庞大的在线 手册,它的终端 man 页也非常全面。手册中列出的任何键入命令都可以在 screen 内运行,或添加到 ~/.screenrc
文件中。例如,如果您不喜欢 Screen 的默认键绑定,可以检查 bindkey
命令来覆盖它们,因为您不希望在接下来的 28 年里再次键入它们。
Screen 技巧表
# Type before other commands
Prefix: Control + a
Shortcuts menu: ?
New window: c Split Vertical: | Copy mode: [
Close window: k Split Horizontal: S Start copy: space
Next window: n Focus next region: tab Scroll up: u
Prior window: p Quit split screem: Q Scroll down: d
Jump window #: 0-9 End copy: space
List windows: " Paste: ]
End copy mode: escape
Detach: d
Quit: \
# Terminal commands
Launch Screen: screen
Named session: screen -S <name>
List sessions: screen -ls
Re-attach session: screen -r [name]
这篇文章最初发布在 PerlTricks.com 上。
标签
反馈
这篇文章有什么问题吗?通过在 GitHub 上打开问题或拉取请求来帮助我们。