Como você pode alterar a linha de status da tela GNU com base no nome do host?

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) coloque o nome do host na linha de status fixo em uma cor diferente para indicar quando 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 instruções condicionais no .screenrc? Um rápido grep da página de manual não parece revelar nada óbvio.

EDITAR:

Para esclarecer, eu já tenho uma linha de status rígida personalizada; Quero alterar algumas das cores / campos exibidos com base no nome do host em que a tela é chamada. Eu já tenho algo parecido com isso no meu PS1, no entanto, prefiro fazer isso na linha de status da tela enquanto pulo desses hosts para roteadores / switches, o que não me permite fazer nenhuma coloração imediata. Dessa forma, posso ter uma janela para produção e outra para desenvolvimento, com a cor da linha de status da tela me dizendo em qual delas estou rapidamente.

Murali Suriar
fonte
Nome do host da máquina na qual a tela está sendo executada? Ou o nome do host dessa tela específica está sendo usado?
Kyle Brandt
@Kyle: nome do host da máquina na qual a tela está sendo executada. Veja a pergunta atualizada para um pouco mais detalhadamente.
Murali Suriar 29/05/2009

Respostas:

13

Eu vejo duas maneiras de fazer isso, a primeira é criar um arquivo .screenrc pelo host.
Como .screenrc_serverA, .screenrc_serverB...
No script de inicialização do shell, defina SCREENRC para algo como .screenrc_`hostname`
É claro que você pode usar o comando source da tela para incluir algo como .screenrc_defaultem cada arquivo .screenrc_… personalizado, para que eles contenham apenas uma linha de legenda / status fixo e não o configuração inteira de cada vez.

A segunda maneira seria executar comandos como screen -X hardstatus lastline ...(usando if testes para executar o comando com valor diferente para ... dependendo do nome do host) em 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 status do hardtop será atualizado.

Obviamente, a 1ª solução é melhor, porque a segunda atualizará a linha de status definitivo toda vez que você abrir uma janela de notícias, o que provavelmente é inútil, pois o nome do host não será alterado.

raio
fonte
Quando você lê ".screenrc_hostname", lê ".screenrc_ hostname". Eu tenho problema para incluir `no pós
raio
Bom - eu perdi a parte da página de manual sobre a variável de ambiente SCREENRC sendo pesquisada primeiro.
Murali Suriar
@radius eu era capaz de adicionar acentos graves usando esta sugestão: meta.stackexchange.com/a/70679/167351
de Bruno Bronosky
16

O @radius está no ponto certo 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 nos scripts é com tput, não com caracteres de escape. Seus caracteres de escape são específicos para o seu terminal. O comando tput está ciente do terminal. Eu escrevi isso para quando eu preciso ficar chique nos 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

Também fiz um script para demonstrar o uso de tput. Você pode obtê-lo a partir desta essência.

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

Bruno Bronosky
fonte
1
Eu encontrei duas "inconsistências". O primeiro é o fato de que também setafé usado o plano de fundo , embora deva ser setab( b em vez de f ) e o segundo que usar 9como padrão não está funcionando para mim, talvez porque a versão tput não seja padrão (seja no seu caso ou na minha, eu simplesmente não sabem e isso realmente não importa muito)
Sombra
@ Shadow obrigado por pegar isso. Eu corrigi isso.
precisa saber é o seguinte
5

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

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

Fornecerá uma linha de status na parte inferior que parece

exemplo de status de tela

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

exibir a hora também ajuda a manter a vida ativa se você fizer o ssh para servidores remotos para executar a tela, pois o tempo que muda a cada minuto manterá sua sessão ativa, mesmo que o shell esteja ocioso no lado remoto.

Tim Kennedy
fonte
Isso não me permite formatar condicionalmente o nome do host com base em sua estrutura (por exemplo, qualquer nome de host que termine em '-dev' em azul, qualquer nome de host que termine em '-prod' em vermelho).
Murali Suriar
ah se apenas screenrc se-declarações suportadas regex.
Tim Kennedy
4

Você pode colorir a linha de status de dentro de um script de backtick imprimindo \005{..r}ou similar ( rpara vermelho etc., assim como dentro de .screenrcsi), para que você possa fazer o hash do nome do host para chegar a um número ou ter várias instruções condicionais para definir a cor. Como exemplo, aqui está um script para alterar a cor e imprimir o nome do host para uso na tela:

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

Em seguida, você adiciona uma entrada para esse script .screenrce faz referência a ele dentro do status rígido ou da legenda como% 4`:

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

Isso pressupõe que é improvável que o nome do host 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.

Dominic Watkins
fonte
+1 por mencionar a screenfuga \005- dessa forma, toda a formatação condicional pode ser colocada em um shell script muito mais legível, em vez daqueles já difíceis de analisar caption. hardstatusdiretivas de tela.
ckujau 14/08
1

Se você quiser evitar muitos scripts, tente o seguinte:

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

O grep imprimirá o nome do host apenas se corresponder a "prod", para que você possa conectá-lo a um backtick e à %?construção. Viola!

Neal Fultz
fonte