Come è possibile modificare la riga di stato della schermata GNU in base al nome host?


31

Ho una home directory condivisa che viene montata automaticamente tramite NFS su tutti i server UNIX a cui accedo. Vorrei avere un unico .screenrc che (ad esempio) mette il nome host nella riga dell'hardstatus in un colore diverso per indicare quando sono collegato alla produzione rispetto allo sviluppo; i nostri nomi host sono tali che questo può essere fatto facilmente attraverso l'uso della corrispondenza dei modelli.

Esiste un modo per inserire le istruzioni condizionali in .screenrc? Una rapida panoramica della pagina man non sembra rivelare nulla di ovvio.

MODIFICARE:

Per chiarire, ho già una linea di stato hard personalizzata; Voglio cambiare alcuni dei colori / campi visualizzati in base al nome host su cui viene invocata la schermata. Ho già qualcosa del genere per la mia PS1, tuttavia preferirei farlo nella riga di stato dello schermo mentre salgo da questi host a router / switch, il che non mi consente di eseguire una rapida colorazione. In questo modo, posso avere una finestra per la produzione e una per lo sviluppo, con il colore della linea di stato dello schermo che mi dice su quale mi trovo a colpo d'occhio.


Nome host della macchina su cui è in esecuzione lo schermo? O il nome host di quella particolare finestra 'finestra' sta usando?
Kyle Brandt,

@Kyle: nome host della macchina su cui è in esecuzione lo schermo. Vedi la domanda aggiornata per un po 'più di dettaglio.
Murali Suriar,

Risposte:


13

Vedo due modi per farlo, il primo è creare un file .screenrc dall'host.
Come .screenrc_serverA, .screenrc_serverB, ...
Nello script di avvio della shell impostare screenrc a qualcosa come .screenrc_`hostname`
Naturalmente è possibile utilizzare il comando fonte di schermo per includere qualcosa di simile .screenrc_defaultin ogni .screenrc_ personalizzato ... file in modo che contiene solo una linea didascalia / hardstatus e non il intera configurazione ogni volta.

Il secondo modo sarebbe quello di eseguire comandi come screen -X hardstatus lastline ...(usando if test per eseguire il comando con un valore diverso per ... a seconda del nome host) nello script di avvio della shell. Quando accederai al server, lo schermo -X non farà nulla perché lo schermo non sarà ancora avviato, ma ogni volta che apri una nuova finestra sullo schermo l'hardstatus verrà aggiornato.

Ovviamente la prima soluzione è migliore perché la seconda aggiornerà la riga dell'hardstatus ogni volta che aprirai una finestra di notizie che è probabilmente inutile poiché il nome host non sarà cambiato.


Quando leggi ".screenrc_hostname" leggi ".screenrc_ hostname". Ho avuto problemi ad includere `nel post
raggio il

Bello - Ho perso la parte nella pagina man sulla variabile d'ambiente SCREENRC che è stata cercata per prima.
Murali Suriar,

@radius Sono stato in grado di aggiungere backtick usando questo suggerimento: meta.stackexchange.com/a/70679/167351
Bruno Bronosky

16

@radius è perfetto con la cosa di SCREENRC, ma non è stata una risposta molto completa, quindi elaborerò ...

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

* Usa sempre nuovi test !

Una parola sui personaggi di fuga

Il modo corretto di includere i colori negli script è con tput, non con caratteri di escape. I tuoi personaggi di escape sono specifici per il tuo terminale. Il comando tput è a conoscenza del terminale. Ho scritto questo per quando ho bisogno di avere fantasia nei miei script:

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

Ho anche realizzato una sceneggiatura per dimostrare l'uso di tput. Puoi ottenerlo da questa idea.

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


1
Ho trovato due "incongruenze". Il primo è il fatto che setafviene utilizzato anche per lo sfondo , anche se dovrebbe essere setab( b invece di f ) e il secondo che l'utilizzo 9come predefinito non funziona per me, forse perché la versione tput non è standard (né in nel suo caso o nel mio, semplicemente non lo so e non ha molta importanza)
Shadow

@Ombretto grazie per averlo colto. L'ho corretto.
Bruno Bronosky,

5

Basta impostarlo nel tuo .screenrc come variabile hardstatus. Finché stai usando una variabile come% H per il nome host, cambierà per corrispondere a qualsiasi nome host su cui lavori.

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

Ti darà una linea di stato in fondo che sembra

esempio di schermo hardstatus

il nome host è rosso su nero, l'ora è verde su nero, la data è gialla su nero. la finestra contrassegnata con * è la finestra corrente, mostrata in testo blu su sfondo bianco. la finestra contrassegnata con - è la finestra precedentemente attiva, con testo bianco su nero. la finestra 1, sopra, non è né attuale né precedente e verrebbe mostrata in bianco su nero. le altre possibilità ti mostrerebbero altri utenti collegati a Windows, bianco su nero, e saranno contrassegnati da +.

avere la visualizzazione del tempo aiuta anche a mantenere vivo se si esegue ssh su server remoti per eseguire lo schermo, poiché il tempo che cambia ogni minuto manterrà viva la sessione, anche se la shell è inattiva sul lato remoto.


Ciò non mi consente di formattare in modo condizionale il nome host in base alla sua struttura (ad esempio qualsiasi nome host che termina in '-dev' in blu, qualsiasi nome host che termina in '-prod' in rosso.)
Murali Suriar

ah. se solo screenrc istruzioni if ​​supportate regex.
Tim Kennedy,

4

Puoi colorare la riga di stato all'interno di uno script backtick stampando \005{..r}o simili ( rper il rosso ecc. Proprio come all'interno di .screenrcse stesso), quindi potresti hash il nome host per arrivare a un numero, o semplicemente avere un mucchio di istruzioni condizionali da impostare il colore. Ad esempio, ecco uno script per cambiare il colore e stampare il nome host da utilizzare all'interno dello schermo:

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

Quindi aggiungi una voce per questo script .screenrce fai riferimento all'interno dell'hardstatus o della didascalia come% 4`:

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

Ciò presuppone che è improbabile che il nome host cambi, quindi il timeout e la validità di 1 ora (3600 secondi); i bit che circondano la chiamata al backtick stesso mettono semplicemente la data all'inizio della riga e l'ora dopo il nome host.

È anche possibile utilizzare questo meccanismo per colorare l'output di uno script in base al valore del livello di carica della batteria, al carico del sistema o alla temperatura, supponendo che si abbia accesso ai valori rilevanti da uno script della shell.


+1 per menzionare la screenfuga \005- in questo modo l'intera formattazione condizionale può essere inserita in uno script shell molto più leggibile invece di quelli già difficili da analizzare caption. hardstatusdirettive sullo schermo.
ckujau,

1

Se vuoi evitare molti script, puoi provare questo:

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

grep stamperà il nome host solo se corrisponde a "prod", quindi puoi collegarlo a un backtick e al %?costrutto. Viola!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.