我必须知道什么才能正确使用GNU Screen?[关闭]


106

我刚刚向GNU Screen介绍了一个朋友,他们很难适应它。这使我想到了他需要了解的关于出色的Screen实用程序的基本知识,以及那些您认为应该从头开始教导初学者的知识。有什么类比和方便的技巧来记住绑定等?

这一定非常棒。


1
这里也有一些很好的答案:stackoverflow.com/questions/70661/what-is-gnu-screen
Chris

有人在“ 服务器故障”上发布了与此类似的问题。
Vagnerr

如果某人刚开始使用Screen时遇到困难,那么他们可能想看看替代的tmux
Christopher Bottoms 2015年

Answers:


93

我已经使用Screen了10多年,可能只使用了不到一半的功能。因此,绝对没有必要立即学习其所有功能(我不建议尝试)。我的日常命令是:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

我认为就是这样。我有时会使用分屏功能,但肯定不是每天使用。另一个提示是,如果屏幕似乎由于意外击中某些随机键组合而被锁定,请同时执行两个操作^Q^A ^Q尝试将其解锁。


1
^ A k应该添加到列表中以关闭窗口。
莱奥列奥波尔德赫兹준 영

7
我不使用^ A k,因为可能会意外杀死比我预期的更多的东西。相反,我只是使用^ D(或exit)在窗口中退出外壳。退出窗口中的最后一个外壳后,屏幕窗口将自动关闭。
2009年

9
“ ^ A esc-复制模式,我用于回滚”先生,您是男人中间的神。
罗伯·霍华德

4
^ A [完全相同。
atx

感谢^ A ^ D的把戏...我被困住了,无法回到我的会话中。如果这对某人有帮助,我会在不久前
Patrick Forget

36

我直到习惯于在屏幕底部找到一种设置“状态栏”的方法来显示屏幕时,该状态栏才能显示您正在使用的“标签”或“虚拟屏幕”以及存在的其他屏幕。这是我的设置:

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$

3
也可以查看byobu(屏幕配置文件):launchpad.net/byobu
Drew Stephens,2009年

太好了,谢谢。我想弄清楚拆分终端时实际发生的情况。我不知道我需要先运行屏幕才能使这些命令中的任何一个都能正常工作,我知道。
Ogaday 2015年


26

如果您的朋友习惯于按^ABash键以开始到行首,那么他/她会有些意外,因为这^A是屏幕命令键绑定。通常我最终会死机,这可能是因为我在按下某些随机键后^A :-)

在那种情况下,我尝试

^A s^A q阻止/取消阻止终端滚动

解决它。要转到屏幕内一行的开始,按键顺序为^A a


1
将转义字符从^ A更改为其他内容很容易。我已经在回答中详细说明了。
安德鲁·约翰逊(Johnson)

3
+ 1 + 1 + 1 ^ A s ...谢谢...锁定屏幕:)
Yuji'Tomita'Tomita

1
@agnul为您的^ A +1 我是正常bash会话中^ A的用户,我无法在屏幕会话中使用它。多谢小费!:)
icasimpan 2012年

感谢您100次,告诉您如何获取ctrl A在屏幕内运行。一生都在寻找。
user674669 2013年

这里的“ A”和“ a”是否区分大小写?
Aditya MP

12

您可以将Ctrl+ 的转义键重新映射A为您选择的另一个键,因此,如果您确实将其用于其他用途,例如,以bash转到行的开头,则只需在〜/中添加一行。 screenrc文件。要使其变为^ b或^ B,请使用:

escape ^bB

在命令行中,使用名称会话来控制多个会话。我为每个任务使用一个会话,每个会话都有多个标签:

  screen -ls#列出您当前的屏幕会话
  screen -S <name>#创建一个名为name的新屏幕会话
  screen -r <名称>#连接到命名的屏幕会话

使用屏幕时,您只需要几个命令:

  ^ A c创建一个新的外壳
  ^ A [0-9]开关外壳
  ^ A k杀死当前外壳
  ^ A d断开与屏幕的连接
  ^ A?显示帮助

一个很好的快速参考可以在这里找到。值得收藏。


我使用嵌套屏幕会话。我从外部开始,screen -e^oo所以我可以使用Ctrl + O,然后从内部开始,screen -m以便他们开始新的会话。
staticsan

1
您可以随时更改退出键。在正在运行的屏幕会话中,键入^A :\Bb然后按Enter,以将退出键设置为^ B。通常,^A :让您评估您.screenrc了解的命令。
马拉纳2013年

8

针对那些熟悉屏幕但又不记得在手册页中阅读的内容的人的一些提示:

  • 更改屏幕窗口的名称非常简单:ctrl+ A shift+ A
  • 您是否错过了屏幕上的最后一条消息?ctrl+ a ctrl+ m将再次为您显示。
  • 如果您想运行某些内容(例如尾随文件)并在有更改时让屏幕告诉您,请在目标窗口上使用ctrl+ A shift+ m。警告:如果有任何更改,它将通知您。
  • 是否要直接选择窗口15?在您的.screenrc文件中尝试这些:
bind  ! select 11
bind  @ select 12
bind \# select 13
bind  $ select 14
bind  % select 15
bind \^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

为Windows 10到19 分配ctrl+ a shift+ 0 through 9


7

Ctrl+ A是基本命令

Ctrl+ A N=转到*** N ***下一屏

Ctrl+ A P=转到*** P ***上一个屏幕

Ctrl+ A C= *** C ***创建新屏幕

Ctrl+ A D= *** D ***到达屏幕


6

http://www.debian-administration.org/articles/34

我是几年前写的,但是它仍然是一个很好的介绍,得到了很多积极的反馈。


链接已(有效)断开:$VAR1 = \'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused") at ../lib/Singleton/DBI.pm line 95. ';
Peter Mortensen

6

我“必须”添加此内容:添加

bind s

你的.screenrc,如果你-像我一样-用于使用分割窗口,为C-a S分裂实际的窗口,但C-a s冻结它。所以我只是禁用了冻结快捷方式。


2
^-Q如果击中则解冻^-S
柏拉图

你说得对@Plato。我仍然在与用户一起工作的环境中,这些用户几乎不会记住任何快捷方式...我需要禁用它。
Zsolt Botykai

NP我只是首先找到了这个线程并搜索了“冻结”,却没有找到我想要的东西
柏拉图

6

Ctrl+ a是特殊键。

Ctrl+ a d-[d]讲课,将程序(irssi?)留在后台,然后回家。

Ctrl+ a c[c]创建新窗口 Ctrl+ a 0-9按编号在窗口之间切换

屏幕-r-返回到分离的会话

这涵盖了90%的用例。不要试图一次显示所有功能。


虽然,当我第一次了解时,screen我对拆卸重新安装屏幕的实际含义感到困惑。Quote:“ ...您可以在给定机器上的单独控制台中(例如,remmote计算机上的ssh,IRC会话等)进行长时间运行的任务,与会话分离,从一个物理位置移动到另一个物理位置,连接到通过ssh并重新连接到屏幕会话以继续工作。”
JW。


3

我对.screenrc的第一个修改是更改转义命令。与你们中的许多人一样,我不喜欢默认的Ctrl-A序列,因为它在几乎所有其他情况下都会干扰基本功能。在我的.screenrc文件中,添加:

逃脱

那是反推。

这使我可以将反引号用作转义键(例如,创建一个新屏幕,我按backtick-c,detach是backtick-d,backtick-?是帮助,backtick-backtick是上一个屏幕,等等)。干扰的唯一方法(我不得不戒掉习惯)是在命令行上使用反引号捕获执行输出,或者粘贴任何包含反引号的内容。对于前者,我通过使用BASH $(command)约定改变了习惯。对于后者,我通常只是弹出另一个xterm或与屏幕分离,然后粘贴包含反引号的内容。最后,如果要插入文字反引号,只需按backtick-e。


辉煌。我一直都使用反引号,即使我知道我应该使用$(...),所以现在我想我可能不得不改变自己的方式。反引号有点儿麻烦,但是最好有一个不需要修饰符的键。但是为什么选择“ e”,您又如何记住呢?
iconoclast

我刚刚测试了``转义'',它可以很好地工作并且似乎更容易记住。如果您反击并且没有得到您所期望的,只需再次击中它即可。
iconoclast

我已经做到了,但是有没有一种方法可以在屏幕上实际键入反引号?有时候,有必要这样做,而我讨厌不得不分开来做……
Guillochon 2012年

@Guillouchon:前面的评论恰恰说明了这一点。
2013年

3

在下一版本的Ubuntu Server中,默认情况下会进行一些有趣的工作以获取良好的GNU屏幕设置,其中包括使用屏幕底部显示所有窗口以及其他有用的机器详细信息(例如更新数量)可用以及计算机是否需要重新启动)。您可能可以抓住他们.screenrc并根据需要对其进行自定义。

我拥有的最有用的命令.screenrc如下:

shelltitle "$ |bash" # Make screen assign window titles automatically
hardstatus alwayslastline "%w" # Show all window titles at bottom line of term

这样,我总是知道打开了哪些窗口,以及当前正在运行的窗口。


3

我将以下内容用于ssh

#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command

wd=`pwd`
cmd=$1
shift

# We can tell if we are running inside screen by looking
# for the STY environment variable.  If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.

if [ -z "$STY" ]; then
        $cmd $*
else
        # Screen needs to change directory so that
        # relative file names are resolved correctly.
        screen -X chdir $wd

        # Ask screen to run the command
        if [ $cmd == "ssh" ]; then
                screen -X screen -t ""${1##*@}"" $cmd $*
        else
                screen -X screen -t "$cmd $*" $cmd $*
        fi
fi

然后设置以下bash别名:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

它使用ssh打开上述别名和iff的新屏幕,并使用ssh主机名重命名屏幕标题。


2

我想为屏幕设置一个带有描述性名称的屏幕会话。^ a A将为您提供当前窗口的名称,而^ a“将为您提供窗口列表。完成后,使用^ ad分离屏幕,然后使用screen -R重新连接


1

我喜欢用来screen -d -RR自动创建/附加到给定的屏幕。我创建了bash函数以使其更容易...

function mkscreen
{
    local add=n

    if [ "$1" == '-a' ]; then
        add=y
        shift;
    fi

    local name=$1;
    shift;
    local command="$*";

    if [ -z "$name" -o -z "$command" ]; then
        echo 'Usage: mkscreen [ -a ] name command

    -a          Add to .bashrc.' 1>&2;
        return 1;
    fi

    if [ $add == y ]; then
        echo "mkscreen $name $command" >> $HOME/.bashrc;
    fi

    alias $name="/usr/bin/screen -d -RR -S $name $command";

    return 0;
}

function rmscreen
{
    local delete=n

    if [ "$1" == '-d' ]; then
        delete=y
        shift;
    fi

    local name=$1;

    if [ -z "$name" ]; then
        echo 'Usage: rmscreen [ -d ] name

    -d          Delete from .bashrc.' 1>&2;
        return 1;
    fi

    if [ $delete == y ]; then
        sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
    fi

    unalias $name;

    return 0;
}

他们为创建别名/usr/bin/screen -d -RR -S $name $command。例如,我喜欢在屏幕会话中使用irssi,因此在我的.bashrc(在这些功能下)中,我具有:

mkscreen irc /usr/bin/irssi

然后我可以输入 irc一个终端进入irssi。如果屏幕“ irc”还不存在,那么将创建它并从中运行/ usr / bin / irssi(当然,它会自动连接)。如果它已经在运行,那么我将重新连接到它,强行分离已经连接到它的任何其他实例。很好

另一个示例是在遇到Perldocs时为其创建临时屏幕别名:

mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I'm done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc 

-a选项(必须是第一个参数)将屏幕别名附加到.bashrc(因此它是持久性的),而-d则将其删除(它们可能具有破坏性,因此请自担风险)。xD

附加:

当我在屏幕上进行很多工作时,我发现另一种便利主义:

alias sls='/usr/bin/screen -ls'

这样,您可以用更少的击键列出屏幕。我不知道是否sls会与任何现有的实用程序发生冲突,但是当时它在我的系统上没有,所以我选择了它。



0

Ctrl+ A对于Unix用户来说是一个很棒的特殊字符,但是如果您使用屏幕与OpenVMS进行对话,则无法^ A将使您过早地秃头。

VMS中,如果要在从历史记录缓冲区执行之前编辑DCL命令,则插入模式已关闭(由于某些原因,我不会进入此处)……将其打开,因此您无需不能过度键入命令而不是将内容间隔开,而是必须按`^ A。


screen -e ^Ll出于类似原因使用;我根本无法取消输入ctrl-A来进入Emacs中的行首的操作。幸运的是,ctrl-L是我很少需要的按键,而且恕我直言,它的一般含义(重绘/清除屏幕)也很好地连接了它。
13年

@tripleee:我的.screenrchas escape ^@^@,它使用空字符而不是control-A。在大多数系统上,您可以输入空字符作为控件空间,这很容易键入。(我在主会话中的窗口中运行着一个嵌套的屏幕会话;为此,我有一个escape ^]^]。)
Keith Thompson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.