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

Ну, учитывая, что это - полностью POSIX, совместимый, я сказал бы да.

31
11.07.2011, 16:46
4 ответа

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

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

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

13
27.01.2020, 19:38
  • 1
    Когда Вы читаете чтение ".screenrc_hostname" ".screenrc_hostname". Я заставил проблему включать 'в сообщение –  radius 30.06.2009, 03:08
  • 2
    Хороший - я пропустил часть в странице справочника о переменной среды SCREENRC, искавшей сначала. подход Gilles –  Murali Suriar 30.06.2009, 14:17
  • 3
    @radius я смог добавить обратные галочки с помощью этого предложения: meta.stackexchange.com/a/70679/167351 –  Bruno Bronosky 22.10.2013, 00:11

@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"

* Всегда используют новые тесты!

Слово о символах ESC

Надлежащий способ включать раскрашивает сценарии, с tput, не символами ESC. Ваши символы ESC характерны для Вашего терминала. Команда 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

16
27.01.2020, 19:38
  • 1
    , я нашел два "несоответствия". Первым является то, что также для фона setaf используется, хотя это должно быть setab (b вместо f) и второе это то использование 9 поскольку значение по умолчанию не работает на меня, возможно, потому что tput-версия не является стандартной (или в его случае или в моем, я просто не знаю, и это действительно не имеет значения очень), большое спасибо –  Shadow 14.08.2012, 11:30
  • 2
    @Shadow благодарит ловить это. Я исправил его. –  Bruno Bronosky 22.10.2013, 00:12

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

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

Даст Вам строку состояния внизу, которая похожа

screen hardstatus example

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

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

5
27.01.2020, 19:38
  • 1
    , Который не позволяет мне условно форматировать имя хоста на основе его структуры (например, любое имя хоста, заканчивающееся в '-dev' синего цвета, любое имя хоста, заканчивающееся в '-напоминании' красного цвета.) –  Murali Suriar 27.09.2011, 20:54
  • 2
    ах. если только screenrc операторы "if" поддерживал regex. –  Tim Kennedy 27.09.2011, 23:47

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

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

4
27.01.2020, 19:38

Теги

Похожие вопросы