Wie kann man die Statuszeile des GNU-Bildschirms basierend auf dem Hostnamen ändern?

31

Ich habe ein freigegebenes Basisverzeichnis, das über NFS auf allen UNIX-Servern, bei denen ich mich anmelde, automatisch bereitgestellt wird. Ich hätte gerne eine einzige .screenrc-Datei, die (zum Beispiel) den Hostnamen in einer anderen Farbe in die hardstatus-Zeile einfügt, um anzuzeigen, wann ich bei der Produktion angemeldet bin. Unsere Hostnamen sind so beschaffen, dass dies durch die Verwendung von Pattern Matching leicht möglich ist.

Gibt es eine Möglichkeit, bedingte Anweisungen in .screenrc einzufügen? Ein kurzer Blick auf die Manpage scheint nichts Offensichtliches zu verraten.

BEARBEITEN:

Zur Verdeutlichung habe ich bereits eine benutzerdefinierte feste Statuszeile. Ich möchte einige der angezeigten Farben / Felder basierend auf dem Hostnamen ändern, auf dem der Bildschirm aufgerufen wird. Ich habe bereits so etwas für meine PS1, aber ich würde dies lieber in der Bildschirmstatuszeile tun, wenn ich von diesen Hosts zu Routern / Switches springe, wodurch ich keine sofortige Einfärbung vornehmen kann. Auf diese Weise kann ich ein Fenster für die Produktion und eines für die Entwicklung haben, wobei die Farbe der Bildschirmstatuszeile auf einen Blick angibt, auf welchem ​​ich mich befinde.

Murali Suriar
quelle
Hostname des Rechners, auf dem der Bildschirm läuft? Oder der Hostname des jeweiligen Fensters?
Kyle Brandt
@Kyle: Hostname des Computers, auf dem der Bildschirm ausgeführt wird. Weitere Informationen finden Sie in der aktualisierten Frage.
Murali Suriar

Antworten:

13

Ich sehe zwei Möglichkeiten, dies zu tun. Die erste besteht darin, eine .screenrc-Datei nach Host zu erstellen.
Wie .screenrc_serverA, .screenrc_serverB...
In der Shell - Startskript setzen screenrc um so etwas wie .screenrc_`hostname`
Selbstverständlich können Sie die Quelle Befehl Bildschirm verwenden so etwas wie schließen .screenrc_defaultin jedem benutzerdefinierten .screenrc_ ... Dateien so , dass sie nur eine Beschriftung / hard Zeile enthalten und nicht die ganze Konfiguration jedes Mal.

Die zweite Möglichkeit wäre, Befehle wie screen -X hardstatus lastline ...(mithilfe von if-Tests, um den Befehl mit einem unterschiedlichen Wert für ... abhängig vom Hostnamen auszuführen) in Ihrem Shell-Startskript auszuführen. Wenn Sie sich auf dem Server anmelden, wird Bildschirm -X nichts tun, da Bildschirm noch nicht gestartet wird, aber jedes Mal, wenn Sie ein neues Fenster auf dem Bildschirm öffnen, wird der Hardstatus aktualisiert.

Natürlich ist die erste Lösung besser, da die zweite die Hardstatuszeile jedes Mal aktualisiert, wenn Sie ein Nachrichtenfenster öffnen. Dies ist wahrscheinlich nutzlos, da sich der Hostname nicht geändert hat.

Radius
quelle
Wenn Sie ".screenrc_hostname" lesen, lesen Sie ".screenrc_ hostname". Ich habe ein Problem damit, "in den Post
Radius" vom
Nizza - Ich habe den Teil in der Manpage über die Umgebungsvariable SCREENRC verpasst, der zuerst durchsucht wurde.
Murali Suriar
@radius Mit diesem Vorschlag konnte ich Backticks hinzufügen: meta.stackexchange.com/a/70679/167351
Bruno Bronosky
16

@radius ist genau richtig mit dem SCREENRC-Ding, aber es war keine sehr vollständige Antwort, also werde ich näher darauf eingehen ...

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

* Verwenden Sie immer neue Tests !

Ein Wort zu Fluchtcharakteren

Die korrekte Art, Farben in Skripten einzubeziehen, ist die Verwendung von tput und nicht von Escape-Zeichen. Ihre Escape-Zeichen sind spezifisch für Ihr Terminal. Der Befehl tput ist terminalfähig. Ich habe das geschrieben, wenn ich Lust auf meine Skripte habe:

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

Ich habe auch ein Skript erstellt, um die Verwendung von tput zu demonstrieren. Sie können es von diesem Kern erhalten.

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

Bruno Bronosky
quelle
1
Ich habe zwei "Inkonsistenzen" gefunden. Das erste ist die Tatsache, dass auch für den Hintergrund setafverwendet wird, obwohl es sein sollte setab( b statt f ) und das zweite, dass die Verwendung 9als Standard bei mir nicht funktioniert, vielleicht weil die tput-Version nicht Standard ist (auch nicht in Sein Fall oder meiner, ich weiß es einfach nicht und es ist nicht wirklich wichtig)
Shadow
@ Shadow, danke, dass du das verstanden hast. Ich habe es korrigiert.
Bruno Bronosky
5

Stellen Sie es einfach in Ihrem .screenrc als die Variable hardstatus ein. Solange Sie eine Variable wie% H für den Hostnamen verwenden, wird diese so geändert, dass sie mit jedem Hostnamen übereinstimmt, den Sie bearbeiten.

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

Gibt Ihnen eine Statuszeile am unteren Rand, die aussieht

Bildschirm hardstatus Beispiel

Hostname ist rot auf schwarz, Uhrzeit ist grün auf schwarz, Datum ist gelb auf schwarz. Das mit * gekennzeichnete Fenster ist das aktuelle Fenster und wird in blauer Schrift auf weißem Hintergrund angezeigt. Fenster markiert mit - ist das zuvor aktive Fenster, angezeigt wird weißer Text auf schwarz. Fenster 1 oben ist weder aktuell noch früher und wird in Weiß auf Schwarz angezeigt. Die anderen Möglichkeiten zeigen Ihnen andere Benutzer an, die an Windows angeschlossen sind, weiß auf schwarz und mit + gekennzeichnet sind.

Die Zeitanzeige hilft auch dabei, das System am Leben zu halten, wenn Sie den Bildschirm auf Remote-Servern ausführen, da die sich jede Minute ändernde Zeit Ihre Sitzung am Leben hält, selbst wenn die Shell auf der Remote-Seite inaktiv ist.

Tim Kennedy
quelle
Das erlaubt mir nicht, den Hostnamen basierend auf seiner Struktur bedingt zu formatieren (zB jeder Hostname, der mit '-dev' in blau endet, jeder Hostname, der mit '-prod' in rot endet.)
Murali Suriar
Ah. wenn nur screenrc if-Anweisungen Regex unterstützen.
Tim Kennedy
4

Sie können die Statuszeile innerhalb eines Backtick-Skripts durch Drucken \005{..r}oder ähnliches ( rfür Rot usw. genau wie innerhalb des Skripts .screenrcselbst) einfärben. Sie können also entweder den Hostnamen hashen, um eine Zahl zu erhalten, oder nur eine Reihe von bedingten Anweisungen festlegen die Farbe. Im Folgenden finden Sie ein Skript zum Ändern der Farbe und zum Drucken des Hostnamens zur Verwendung auf dem Bildschirm:

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

Anschließend fügen Sie dem einen Eintrag für dieses Skript hinzu .screenrcund referenzieren ihn innerhalb des Hardstatus oder der Beschriftung als% 4`:

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

Dies setzt voraus, dass sich der Hostname wahrscheinlich nicht ändert, daher das Zeitlimit und die Gültigkeit von 1 Stunde (3600 Sekunden). Die Bits, die den Aufruf zum Backtick selbst umgeben, setzen lediglich das Datum am Anfang der Zeile und die Zeit nach dem Hostnamen.

Sie können diesen Mechanismus sogar verwenden, um die Ausgabe eines Skripts abhängig vom Wert des Akkuladezustands, der Systemlast oder der Temperatur einzufärben, vorausgesetzt, Sie haben über ein Shell-Skript Zugriff auf die entsprechenden Werte.

Dominic Watkins
quelle
+1 für das Erwähnen des screenEscape \005- auf diese Weise kann die gesamte bedingte Formatierung in ein viel besser lesbares Shell-Skript eingefügt werden, anstatt in das bereits schwer zu analysierende captionbzw. hardstatusBildschirmanweisungen.
ckujau
1

Wenn Sie viele Skripte vermeiden möchten, können Sie Folgendes versuchen:

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

grep gibt den Hostnamen nur dann aus, wenn er mit "prod" übereinstimmt. Sie können ihn also an ein Backtick und das %?Konstrukt anschließen. Viola!

Neal Fultz
quelle