Como você pode mudar a linha de status da tela GNU com base no hostname?

31

Eu tenho um diretório pessoal compartilhado que é montado automaticamente via NFS em todos os servidores UNIX nos quais efetuo login. Eu gostaria de ter um único .screenrc que (por exemplo) coloca o nome do host na linha de hardstatus em uma cor diferente para indicar quando eu estou conectado à produção versus desenvolvimento; nossos nomes de host são tais que isso pode ser feito facilmente através do uso de correspondência de padrões.

Existe alguma maneira de colocar declarações condicionais em .screenrc? Um rápido grep da man page não parece revelar nada óbvio.

EDITAR:

Para esclarecer, já tenho uma linha de status rígida personalizada; Desejo alterar alguns dos campos / cores exibidos com base no nome do host em que a tela é invocada. Eu já tenho algo parecido com isso para o meu PS1, no entanto, eu prefiro fazer isso na linha de status da tela como eu pulo fora desses hosts para roteadores / switches, que não me permitem fazer qualquer colorização de prompt. Dessa forma, posso ter uma janela para produção e outra para desenvolvimento, com a cor da linha de status da tela me dizendo qual delas estou em um piscar de olhos.

    
por Murali Suriar 29.05.2009 / 13:29

5 respostas

13

Eu vejo duas maneiras de fazer isso, a primeira é fazer um arquivo .screenrc por host.
Como .screenrc_serverA , .screenrc_serverB , ...
No script de inicialização do shell, defina o SCREENRC como .screenrc_'hostname'
É claro que você pode usar o comando de origem da tela para incluir algo como .screenrc_default em cada arquivo .screenrc_… personalizado, para que eles contenham apenas uma linha de legenda / hardstatus e não toda a configuração de cada vez.

A segunda maneira seria executar comandos como screen -X hardstatus lastline ... (usando if tests para executar o comando com valor diferente para ... dependendo do nome do host) no seu script de inicialização do shell. Quando você fizer logon no servidor, a tela -X não fará nada porque a tela ainda não será iniciada, mas cada vez que você abrir uma nova janela na tela, o estado do disco será atualizado.

É claro que a primeira solução é melhor porque a segunda atualizará a linha de hardstatus toda vez que você abrir uma janela de notícias que provavelmente é inútil, já que o nome do host não será alterado.

    
por 30.06.2009 / 02:06
16

@radius está certo com a coisa do SCREENRC, mas não foi uma resposta muito completa, então vou elaborar…

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

* Sempre use novos testes !

Uma palavra sobre caracteres de escape

A maneira correta de incluir cores em scripts é com tput, não caracteres de escape. Seus caracteres de escape são específicos para o seu terminal. O comando tput é terminal ciente. Eu escrevi isso para quando eu preciso ficar chique em meus scripts:

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

Eu também fiz um script para demonstrar o uso do tput. Você pode obtê-lo desta essência

Consulte: link
="http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html"> link

    
por 11.06.2009 / 08:57
5

Basta configurá-lo em seu .screenrc como a variável hardstatus. Contanto que você esteja usando uma variável como% H para o nome do host, ela será alterada para corresponder a qualquer nome de host que você trabalhe nela.

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

Você terá uma linha de status na parte inferior que parece

o nome do host é vermelho no preto, o tempo é verde no preto, a data é amarelo no preto. janela marcada com * é a janela atual, mostrada em texto azul sobre fundo branco. janela marcada com - é a janela ativa anteriormente, mostrada texto branco em preto. a janela 1, acima, não é atual nem anterior, e seria mostrada em branco sobre preto. as outras possibilidades mostrariam outros usuários conectados a janelas, brancos em preto e marcados com +.

ter a exibição da hora também ajuda a manter vivos se você executar ssh em servidores remotos para executar a tela, pois o tempo que muda a cada minuto manterá sua sessão ativa, mesmo se o shell estiver ocioso no lado remoto.

    
por 27.09.2011 / 19:44
3

Você pode colorir a linha de status de um script de backshk imprimindo r5{..r} ou similar ( .screenrc para vermelho, etc., como dentro do próprio .screenrc ), então você pode alterar o nome do host para chegar a um número, ou apenas tem um monte de instruções condicionais para definir a cor. Por exemplo, aqui está um script para alterar a cor e imprimir o nome do host para uso na tela:

#!/bin/bash
Red="
backtick 4 3600 3600 /usr/local/bin/screen_hostname
caption always "%{.kc}%D %d.%m.%Y %=%{.kg} %4' %{.kc}%0c"
5{..r}" Yellow="
#!/bin/bash
Red="
backtick 4 3600 3600 /usr/local/bin/screen_hostname
caption always "%{.kc}%D %d.%m.%Y %=%{.kg} %4' %{.kc}%0c"
5{..r}" Yellow="%pre%5{..y}" Green="%pre%5{..g}" Blue="%pre%5{..b}" Magenta="%pre%5{..m}" Cyan="%pre%5{..c}" White="%pre%5{..w}" case "$HOSTNAME" in lubuntu-eee) echo -e "$Magenta$HOSTNAME" ;; ubuntu-pc) echo -e "$Magenta$HOSTNAME" ;; *) echo -e "$Green$HOSTNAME" esac
5{..y}" Green="%pre%5{..g}" Blue="%pre%5{..b}" Magenta="%pre%5{..m}" Cyan="%pre%5{..c}" White="%pre%5{..w}" case "$HOSTNAME" in lubuntu-eee) echo -e "$Magenta$HOSTNAME" ;; ubuntu-pc) echo -e "$Magenta$HOSTNAME" ;; *) echo -e "$Green$HOSTNAME" esac

Em seguida, você adiciona uma entrada para esse script ao %code% e faz referência a ele dentro do hardstatus ou a legenda como% 4 ':

%pre%

Isso pressupõe que o nome do host não seja alterado, portanto, o tempo limite e a validade de 1 hora (3600 segundos); os bits que cercam a chamada para o backtick em si apenas colocam a data no início da linha e a hora após o nome do host.

Você pode até usar esse mecanismo para colorir a saída de um script, dependendo do valor do nível de carga da bateria, carga do sistema ou temperatura, supondo que você tenha acesso aos valores relevantes de um script de shell.

    
por 30.12.2012 / 23:04
0

Se você quiser evitar muitos scripts, tente isso:

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

O grep só imprimirá o nome do host se ele corresponder a "prod", então você pode conectar isso a um backtick e à construção %? . Viola!

    
por 17.11.2017 / 02:08