Як ви можете змінити рядок стану екрана GNU на основі імені хоста?


31

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

Чи є спосіб введення умовних висловлювань у .screenrc? Швидке зіткнення сторінки man, схоже, не виявляє нічого очевидного.

Редагувати:

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


Ім'я хоста машини, на якій працює екран? Або ім'я хоста цього конкретного екрана "вікно" використовується?
Кайл Брандт

@Kyle: ім'я хоста машини, на якій працює екран. Дивіться оновлене запитання трохи детальніше.
Муралі Суріар

Відповіді:


13

Я бачу два способи зробити це, перший - зробити файл .screenrc хостом.
Як .screenrc_serverA, .screenrc_serverB...
У вашому сценарії запуску оболонки встановити SCREENRC що - щось на зразок .screenrc_`hostname`
Звичайно , ви можете використовувати команду джерела екрану , щоб включити що - щось на зразок .screenrc_defaultв кожній користувальницької .screenrc_ ... файли так , що вони містять тільки заголовок / hardstatus лінії і не вся конфігурація кожного разу.

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

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


Коли ви читаєте ".screenrc_hostname" читати ".screenrc_ hostname". У мене виникла проблема включити `в пост
радіус

Приємно - я пропустив частину на сторінці man про змінну середовища SCREENRC, яку шукали спочатку.
Муралі Суріар

@radius Мені вдалося додати зворотні посилання за допомогою цієї пропозиції: meta.stackexchange.com/a/70679/167351
Бруно Броноскі

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, хоча він повинен бути 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%?"

Унизу ви отримаєте рядок стану

Приклад жорсткого екрана екрана

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

Показ часу також допомагає зберігати живі, якщо ви переходите на віддалені сервери для запуску екрана, оскільки час, що змінюється щохвилини, збереже ваш сеанс живим, навіть якщо оболонка не працює на віддаленій стороні.


Це не дозволяє мені умовно форматувати ім'я хоста на основі його структури (наприклад, будь-яке ім'я хоста, що закінчується на "-dev" синім кольором, будь-яке ім'я хоста, що закінчується на "-prod" червоним кольором.)
Murali Suriar

ах. якщо підтримується регулярний вираз лише для scrc-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 для згадки про screenвихід \005- таким чином, все умовне форматування може бути поміщене в набагато більш читабельний скрипт оболонки замість тих, які вже важко captionрозбираються. hardstatusекранні директиви.
ckujau

1

Якщо ви хочете уникнути багато сценаріїв, ви можете спробувати це:

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

grep друкує ім'я хоста лише у тому випадку, якщо воно відповідає "prod", тому ви можете підключити його до backtick та %?конструкції. Віола!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.