Как вы можете изменить строку состояния экрана GNU в зависимости от имени хоста?


31

У меня есть общий домашний каталог, который автоматически монтируется через NFS на всех серверах UNIX, на которых я вхожу. Я хотел бы иметь один .screenrc, который (например) помещает имя хоста в строке hardstatus другим цветом, чтобы указывать, когда я вошел в рабочую версию по сравнению с разработкой; наши имена хостов таковы, что это легко сделать с помощью сопоставления с шаблоном.

Есть ли способ поместить условные операторы в .screenrc? Быстрый просмотр справочной страницы, кажется, не раскрывает ничего очевидного.

РЕДАКТИРОВАТЬ:

Чтобы уточнить, у меня уже есть пользовательская жесткая строка состояния; Я хочу изменить некоторые цвета / поля, отображаемые на основе имени хоста, на котором вызывается экран. У меня уже есть что-то подобное для моей PS1, однако я предпочел бы сделать это в строке состояния экрана, когда я прыгаю с этих хостов на маршрутизаторы / коммутаторы, которые не позволяют мне выполнять какую-либо быструю расцветку. Таким образом, у меня может быть одно окно для производства и одно для разработки, причем цвет строки состояния экрана говорит мне, какое окно я вижу с первого взгляда.


Имя хоста машины, на которой запущен экран? Или имя хоста этого конкретного окна используется?
Кайл Брандт

@Kyle: имя компьютера, на котором запущен экран. Смотрите обновленный вопрос для более подробной информации.
Мурали Суриар

Ответы:


13

Я вижу два способа сделать это, первый - создать файл .screenrc на хосте.
Например .screenrc_serverA, .screenrc_serverB...
В вашем скрипте запуска оболочки задайте для SCREENRC что-то вроде этого. .screenrc_`hostname`
Конечно, вы можете использовать исходную команду экрана, чтобы включить что-то похожее .screenrc_defaultв каждый пользовательский файл .screenrc_… так, чтобы они содержали только строку заголовка / hardstatus, а не Вся конфигурация каждый раз.

Вторым способом было бы выполнить команды наподобие screen -X hardstatus lastline ...(используя if тесты для выполнения команды с другим значением для ... в зависимости от имени хоста) в вашем скрипте запуска оболочки. Когда вы войдете на сервер, screen -X ничего не будет делать, потому что screen еще не будет запущен, но каждый раз, когда вы открываете новые окна на экране, hardstatus будет обновляться.

Конечно, первое решение лучше, потому что второе обновляет строку hardstatus каждый раз, когда вы открываете окно новостей, которое, вероятно, бесполезно, поскольку имя хоста не изменится.


Когда вы читаете ".screenrc_hostname", читайте ".screenrc_ hostname". У меня есть проблема, чтобы включить `в пост
радиус

Приятно - я пропустил часть на странице руководства о поиске переменной окружения SCREENRC.
Мурали Суриар

@radius Я смог добавить обратные пометки,
Бруно Броноски

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, а не экранирующие символы. Ваши escape-символы относятся к вашему терминалу. Команда 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используется, хотя это должно быть setab( b вместо f ), а во-вторых, что использование 9по умолчанию не работает для меня, возможно, потому что tput-версия не является стандартной (либо в его дело или мое, я просто не знаю, и это не имеет большого значения)
Shadow

@ Тень, спасибо, что поймали это. Я исправил это.
Бруно Броноски

5

Просто установите его в вашем .screenrc как переменную hardstatus. Пока вы используете переменную типа% H для имени хоста, она будет меняться в соответствии с любым именем хоста, с которым вы работаете.

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

Даст вам строку состояния внизу, которая выглядит как

пример экрана hardstatus

имя хоста - красное на черном, время - зеленым на черном, дата - желтым на черном. окно, помеченное *, является текущим окном, показанным синим текстом на белом фоне. Окно, помеченное - это ранее активное окно, показанное белым текстом на черном. вышеприведенное окно 1 не является ни текущим, ни предыдущим, и будет отображаться белым по черному. другие возможности покажут вам других пользователей, прикрепленных к окнам, белым на черном и помеченных знаком +.

Отображение времени также помогает сохранять живые данные, если вы используете ssh на удаленных серверах для запуска экрана, так как время, изменяющееся каждую минуту, будет поддерживать ваш сеанс в активном состоянии, даже если оболочка простаивает на удаленной стороне.


Это не позволяет мне условно отформатировать имя хоста на основе его структуры (например, любое имя хоста, оканчивающееся на «-dev» синим, любое имя хоста, оканчивающееся на «-prod» красным.)
Murali Suriar

ах. if только 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 секунд); биты, окружающие вызов самого обратного удара, просто помещают дату в начало строки и время после имени хоста.

Вы даже можете использовать этот механизм для окрашивания вывода скрипта в зависимости от значения уровня заряда батареи, нагрузки на систему или температуры, при условии, что у вас есть доступ к соответствующим значениям из скрипта оболочки.


+1 за упоминание screenescape \005- таким образом, все условное форматирование может быть помещено в гораздо более читаемый сценарий оболочки вместо тех, которые уже трудно анализировать, captionсоответственно. hardstatusдирективы экрана.
ckujau

1

Если вы хотите избежать большого количества сценариев, вы можете попробовать это:

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

grep будет печатать имя хоста только в том случае, если оно совпадает с «prod», так что вы можете подключить его к обратному коду и %?конструкции. Виола!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.