Jak zmienić linię statusu ekranu GNU na podstawie nazwy hosta?

31

Mam wspólny katalog domowy, który jest automatycznie montowany przez NFS na wszystkich serwerach UNIX, na których loguję się. Chciałbym mieć jeden plik .screenrc, który (na przykład) umieszcza nazwę hosta w linii hardstatus w innym kolorze, aby wskazać, kiedy jestem zalogowany do produkcji w porównaniu do rozwoju; nasze nazwy hostów są takie, że można to łatwo zrobić za pomocą dopasowania wzorca.

Czy jest jakiś sposób na umieszczenie instrukcji warunkowych w .screenrc? Szybki przegląd strony podręcznika nie wydaje się oczywisty.

EDYTOWAĆ:

Aby to wyjaśnić, mam już niestandardową twardą linię statusu; Chcę zmienić niektóre wyświetlane kolory / pola w oparciu o nazwę hosta, na którym wywoływany jest ekran. Mam już coś takiego dla mojego PS1, jednak wolę to zrobić w linii statusu ekranu, kiedy skaczę z tych hostów do routerów / przełączników, które nie pozwalają mi na szybkie kolorowanie. W ten sposób mogę mieć jedno okno do produkcji, a drugie do rozwoju, a kolor linii statusu ekranu mówi mi, które z nich mam na pierwszy rzut oka.

Murali Suriar
źródło
Nazwa hosta komputera, na którym działa ten ekran? Czy nazwa hosta tego konkretnego „okna” ekranu jest używana?
Kyle Brandt
@Kyle: nazwa hosta komputera, na którym działa ten ekran. Zobacz zaktualizowane pytanie, aby uzyskać więcej szczegółów.
Murali Suriar

Odpowiedzi:

13

Widzę dwa sposoby, aby to zrobić, pierwszy to utworzenie pliku .screenrc przez hosta.
Jak .screenrc_serverA, .screenrc_serverB...
W skrypcie startowym shell set screenrc do czegoś podobnego .screenrc_`hostname`
Oczywiście można użyć polecenia source ekranu zawierać coś takiego .screenrc_defaultw każdym niestandardowym .screenrc_ ... pliki tak, że zawiera tylko podpis / twardego statusu linii i nie za każdym razem cała konfiguracja.

Drugim sposobem byłoby wykonanie poleceń takich jak screen -X hardstatus lastline ...(przy użyciu testów if do wykonania polecenia o innej wartości dla ... w zależności od nazwy hosta) w skrypcie startowym powłoki. Kiedy zalogujesz się na serwerze, screen -X nic nie zrobi, ponieważ screen nie zostanie jeszcze uruchomiony, ale za każdym razem, gdy otworzysz nowe okno na ekranie, status dysku twardego zostanie zaktualizowany.

Oczywiście pierwsze rozwiązanie jest lepsze, ponieważ drugie odświeża linię hardstatus za każdym razem, gdy otwierasz okna wiadomości, co prawdopodobnie jest bezużyteczne, ponieważ nazwa hosta się nie zmieni.

promień
źródło
Kiedy czytasz „.screenrc_hostname”, czytasz „.screenrc_ hostname”. Mam problem z dołączeniem `do postu
promień
Fajnie - brakowało mi części strony podręcznika dotyczącej najpierw przeszukiwanej zmiennej środowiskowej SCREENRC.
Murali Suriar
@radius Udało mi się dodać backticks przy użyciu tej sugestii: meta.stackexchange.com/a/70679/167351
Bruno Bronosky
16

@radius zajmuje się SCREENRC, ale nie była to bardzo kompletna odpowiedź, więc opracuję…

~ / .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"

* Zawsze używaj nowych testów !

Słowo o postaciach ucieczki

Właściwy sposób umieszczania kolorów w skryptach to tput, a nie znaki specjalne. Twoje znaki specjalne są specyficzne dla twojego terminala. Polecenie tput rozpoznaje terminal. Napisałem to na potrzeby, gdy muszę się zachwycać w swoich skryptach:

~ / 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

Zrobiłem też skrypt, aby zademonstrować użycie tput. Możesz to zdobyć z tej treści.

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

Bruno Bronosky
źródło
1
Znalazłem dwie „niespójności”. Pierwszym jest fakt, że również w tle setafjest używany, chociaż powinien to być setab( b zamiast f ), a drugi to, że używanie 9domyślnie nie działa dla mnie, może dlatego, że wersja tput nie jest standardowa (albo w jego sprawa lub moja, po prostu nie wiem i to naprawdę nie ma większego znaczenia)
Shadow
@Shadow dzięki za złapanie tego. Poprawiłem to.
Bruno Bronosky
5

Po prostu ustaw go w swoim .screenrc jako zmienną hardstatus. Tak długo, jak używasz zmiennej takiej jak% H dla nazwy hosta, zmieni się ona tak, aby pasowała do dowolnej nazwy hosta nad którą pracujesz.

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

Daje ci linię statusu na dole, która wygląda

przykład hardstatus ekranu

nazwa hosta jest czerwona na czarnym tle, czas jest zielony na czarnym tle, data jest żółta na czarnym tle. okno oznaczone * to bieżące okno, pokazane niebieskim tekstem na białym tle. okno oznaczone - jest wcześniej aktywnym oknem, pokazanym białym tekstem na czarnym tle. okno 1 powyżej nie jest ani bieżące, ani poprzednie i będzie pokazane na biało na czarno. inne możliwości pokazałyby innym użytkownikom podłączonym do okien, biało-czarnym i oznaczonym znakiem +.

wyświetlanie czasu pomaga również utrzymać przy życiu, jeśli ssh do zdalnych serwerów, aby uruchomić ekran, ponieważ zmiana czasu co minutę utrzyma sesję przy życiu, nawet jeśli powłoka jest bezczynna po stronie zdalnej.

Tim Kennedy
źródło
To nie pozwala mi warunkowo sformatować nazwy hosta na podstawie jego struktury (np. Każda nazwa hosta kończąca się na „-dev” na niebiesko, każda nazwa hosta kończąca się na „-prod” na czerwono.)
Murali Suriar
ah. jeśli tylko instrukcje screenrc if-obsługiwane obsługują wyrażenie regularne.
Tim Kennedy
4

Możesz pokolorować linię statusu z poziomu skryptu wstecznego, drukując \005{..r}lub w podobny sposób ( rdla czerwonego itp., Tak jak w samym .screenrcsobie), więc możesz albo haszować nazwę hosta, aby uzyskać liczbę, albo po prostu mieć kilka instrukcji warunkowych do ustawienia kolor. Jako przykład, oto skrypt do zmiany koloru i wydrukowania nazwy hosta do użycia na ekranie:

#!/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

Następnie dodajesz wpis do tego skryptu .screenrci odwołujesz się do niego w twardym statusie lub podpisie jako% 4`:

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

Zakłada się, że nazwa hosta prawdopodobnie nie ulegnie zmianie, stąd limit czasu i ważność 1 godziny (3600 sekund); bity otaczające wywołanie do samego backticka po prostu umieszczają datę na początku linii i godzinę po nazwie hosta.

Możesz nawet użyć tego mechanizmu do pokolorowania wyniku skryptu w zależności od wartości poziomu naładowania baterii, obciążenia systemu lub temperatury, zakładając, że masz dostęp do odpowiednich wartości ze skryptu powłoki.

Dominic Watkins
źródło
+1 za wzmiankę o screenucieczce \005- w ten sposób całe formatowanie warunkowe można umieścić w znacznie bardziej czytelnym skrypcie powłoki zamiast tych, które już są trudne do przeanalizowania caption. hardstatusdyrektywy ekranowe.
ckujau
1

Jeśli chcesz uniknąć wielu skryptów, możesz spróbować:

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

grep wypisze nazwę hosta tylko, jeśli pasuje do „prod”, więc możesz podłączyć ją do backsticka i %?konstruktu. Altówka!

Neal Fultz
źródło