如何根据主机名更改GNU屏幕状态行?


31

我有一个共享的主目录,该目录通过NFS在我登录的所有UNIX服务器上自动挂载。我希望有一个.screenrc(例如),将主机名以不同的颜色置于hardstatus行中,以指示何时登录生产和开发。我们的主机名可以通过使用模式匹配轻松完成。

有什么办法可以将条件语句放入.screenrc中?手册页的快速grep似乎没有发现任何明显的内容。

编辑:

为了澄清,我已经有一个自定义的硬状态行;我想根据调用屏幕的主机名来更改显示的某些颜色/字段。我的PS1已经有了类似的东西,但是当我从这些主机跳到路由器/交换机时,我宁愿在屏幕状态行中这样做,这不允许我进行任何即时的着色。这样,我可以有一个用于生产的窗口,一个用于开发的窗口,屏幕状态行的颜色告诉我我正在浏览哪个窗口。


运行该屏幕的计算机的主机名?还是该特定屏幕“窗口”的主机名正在使用?
凯尔·布​​兰特

@Kyle:运行屏幕的计算机的主机名。有关更多详细信息,请参见更新的问题。
穆拉里·苏里尔

Answers:


13

我看到两种方法,第一种是由主机制作一个.screenrc文件。
.screenrc_serverA.screenrc_serverB...
在你的shell启动脚本设置SCREENRC喜欢的东西.screenrc_`hostname`
当然你可以使用屏幕的源命令,包括像.screenrc_default在每个自定义.screenrc_ ...文件,以便它们只包含一个标题/ hardstatus线,而不是每次都进行整体配置。

第二种方法是screen -X hardstatus lastline ...在shell启动脚本中执行类似的命令(使用if测试以不同的值来执行命令,具体取决于主机名)。当您登录服务器时,屏幕-X不会执行任何操作,因为屏幕尚未启动,但是每次在屏幕中打开新窗口时,都会更新hardstatus。

当然第一种解决方案更好,因为第二种解决方案每次打开新闻窗口时都会刷新hardstatus行,这可能是无用的,因为主机名不会更改。


当您阅读“ .screenrc_hostname”时,请阅读“ .screenrc_ hostname”。我在发布中加入`时遇到问题
半径

尼斯-我错过了手册页中有关首先搜索SCREENRC环境变量的部分。
Murali Suriar,2009年

@radius我可以使用以下建议添加反引号:meta.stackexchange.com/a/70679/167351
Bruno Bronosky 2013年

16

@radius与SCREENRC有关,但不是一个很完整的答案,因此我将详细说明...

〜/ .bashrc

# Strip down a FQDN
hostname="$(hostname | sed 's/\..*//')"
# Use the case pattern for server groups
case "$hostname" in
    mario|luigi|toad|peach|koopa*|bowser) export SCREENRC=~/.screenrc_prod;;
    dev*|vm*)  export SCREENRC=~/.screenrc_dev;;
esac
# Use condensed bash "new test*" notation to override for specific servers
# e.g. ~/.screenrc_bowser would get used instead of ~/.screenrc_prod
[[ -f "~/.screenrc_$hostname" ]] && export SCREENRC="~/.screenrc_$hostname"

*始终使用新测试

关于转义字符的一句话

在脚本中包含颜色的正确方法是使用tput,而不是转义字符。您的转义符特定于您的终端。tput命令可识别终端。我写这篇文章是为了在脚本中花哨的:

〜/ bin / COLORS.sh

GT_RESET=$(   tput sgr0)  # Reset all attributes
GT_BRIGHT=$(  tput bold)  # Set “bright” attribute
GT_DIM=$(     tput dim)   # Set “dim” attribute (normal/non-bright)
GT_ULINE=$(   tput smul)  # Set “underscore” (underlined text) attribute
GT_BLINK=$(   tput blink) # Set “blink” attribute
GT_INVERSE=$( tput rev)   # Set “inverse” attribute
GT_HIDDEN=$(  tput invis) # Set “hidden” attribute

FG_BLACK=$(   tput setaf 0) #foreground to color #0 - black
FG_RED=$(     tput setaf 1) #foreground to color #1 - red
FG_GREEN=$(   tput setaf 2) #foreground to color #2 - green
FG_YELLOW=$(  tput setaf 3) #foreground to color #3 - yellow
FG_BLUE=$(    tput setaf 4) #foreground to color #4 - blue
FG_MAGENTA=$( tput setaf 5) #foreground to color #5 - magenta
FG_CYAN=$(    tput setaf 6) #foreground to color #6 - cyan
FG_WHITE=$(   tput setaf 7) #foreground to color #7 - white

BG_BLACK=$(   tput setab 0) #background to color #0 - black
BG_RED=$(     tput setab 1) #background to color #1 - red
BG_GREEN=$(   tput setab 2) #background to color #2 - green
BG_YELLOW=$(  tput setab 3) #background to color #3 - yellow
BG_BLUE=$(    tput setab 4) #background to color #4 - blue
BG_MAGENTA=$( tput setab 5) #background to color #5 - magenta
BG_CYAN=$(    tput setab 6) #background to color #6 - cyan
BG_WHITE=$(   tput setab 7) #background to color #7 - white

我还制作了一个脚本来演示tput的用法。您可以从这个要点中获得它。

请参阅:
http : //www.ibm.com/developerworks/aix/library/au-learningtput/? S_TACT =
105AGY06 http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html


1
我发现了两个“不一致之处”。第一个事实是也使用了背景setaf,尽管它应该是setabb而不是f),第二个事实是使用9默认值对我不起作用,可能是因为tput-version不是标准的(在他的案子还是我的案子,我根本不知道,也没什么大不了的)
Shadow

@Shadow感谢您抓住这一点。我纠正了。
布鲁诺·布罗诺斯基

5

只需在您的.screenrc中将其设置为hardstatus变量即可。只要您使用%H之类的变量作为主机名,它就会更改为匹配您在其中使用的任何主机名。

hardstatus alwayslastline "%{rk}%H %{gk}%c %{yk}%M%d %{wk}%?%-Lw%?%{bw}%n*%f %t%?(%u)%?%{wk}%?%+Lw%?"

会在底部显示状态行

屏幕硬状态示例

主机名黑底红字,时间黑底绿字,日期黑底黄字。标有*的窗口是当前窗口,在白色背景上以蓝色文本显示。标有-的窗口是先前处于活动状态的窗口,黑色显示为白色文本。上方的窗口1既不是当前窗口也不是先前窗口,将以黑底白字显示。其他可能性将向您显示其他用户已连接到Windows,黑底白字并用+标记。

如果您将SSH切换到远程服务器以运行屏幕,则具有时间显示还有助于保持活动状态,因为每分钟更改时间将使您的会话保持活动状态,即使Shell在远程侧处于空闲状态。


这不允许我根据其结构有条件地格式化主机名(例如,任何以'-dev'结尾的主机名都以蓝色表示,任何以'-prod'结尾的主机名都以红色表示。)
Murali Suriar

啊。如果仅screenrc if语句支持正则表达式。
蒂姆·肯尼迪

4

您可以通过打印\005{..r}或类似的方式在反引号脚本中为状态行着色(r就像在.screenrc自身内部一样,为红色等),因此您可以对主机名进行哈希处理以得出一个数字,也可以设置一堆条件语句颜色。例如,下面是一个脚本,它可以更改颜色并打印主机名以在屏幕上使用:

#!/bin/bash
Red="\005{..r}"
Yellow="\005{..y}"
Green="\005{..g}"
Blue="\005{..b}"
Magenta="\005{..m}"
Cyan="\005{..c}"
White="\005{..w}"

case "$HOSTNAME" in
   lubuntu-eee)
      echo -e "$Magenta$HOSTNAME"
      ;;
   ubuntu-pc)
      echo -e "$Magenta$HOSTNAME"
      ;;
   *)
      echo -e "$Green$HOSTNAME"
esac

然后,您将此脚本的条目添加到中,.screenrc并在hardstatus或标题中将其引用为%4`:

backtick 4 3600 3600 /usr/local/bin/screen_hostname
caption always "%{.kc}%D %d.%m.%Y %=%{.kg} %4` %{.kc}%0c"

这假定主机名不太可能更改,因此超时和有效性为1小时(3600秒);反引号本身调用周围的位只是将日期放在行的开头,而将时间放在主机名之后。

假设您可以从Shell脚本访问相关的值,甚至可以使用此机制根据电池电量,系统负载或温度的值来为脚本的输出着色。


+1表示screen转义\005-这样,可以将整个条件格式放入更具可读性的Shell脚本中,而不是已经很难解析的脚本中captionhardstatus屏幕指令。
ckujau

1

如果要避免使用大量脚本,可以尝试以下操作:

backtick 5 99999 99999 grep prod /etc/hostname
caption always "%?%{.R.}%5`%:%H%?"

grep仅在匹配“ prod”的情况下才会打印主机名,因此您可以将其插入反引号和%?构造中。中提琴!

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.