Bash prompt para mudar de cor quando estou logado em um servidor

13

Existe uma maneira de tornar o prompt do bash dinâmico, para que ele mude de cor quando estiver conectado a um servidor?

Por isso, quero que a cor fique verde quando estiver no meu sistema e mude para vermelho quando estiver conectada aos servidores. Eu tenho um grande número de servidores que eu não quero colocar um .bashrc diferente em todos esses.

    
por nitins 29.08.2016 / 08:23

4 respostas

9

O prompt remoto é definido pelo controle remoto ~/.bashrc . Então você ainda precisa copiá-lo para o servidor remoto. No entanto, você pode usar um único ~/.bashrc para todos os hosts e definir a cor do prompt com base no nome do host:

[ "$PS1" ] || return 0                           # continue only when interactive
case $(hostname -s) in
laptop*)
    prompt_color='3[48;5;16m3[38;5;46m'    # green(46) on black(16)
    ;;
server*)
    prompt_color='3[48;5;16m3[38;5;196m'   # red(196) on black(16)
    ;;
esac
ORIG_PS1=$PS1                                    # in case needed
PS1='<\['${prompt_color}'\]\h\[3[m\]:\w>\$ '
unset prompt_color

Notas:

  • Não defina PS1 se ainda não estiver definido (ou seja, se o shell não for interativo). Testar se PS1 não é vazio é uma maneira muito comum de decidir se o shell é interativo e você não quer confundir programas que fazem isso. (Indiscutivelmente um teste mais preciso é verificar se $- contém i .)

  • Se quiser que esse código seja executado ao efetuar login em um servidor remoto, você deverá ter um dos arquivos de perfil sempre como fonte ~/.bashrc . Mas eu suponho que você saiba disso.

  • Em PS1 , os códigos de escape devem estar entre \[...\] .

  • \[033[m redefine o primeiro plano e o segundo plano como padrão. Então, aqui, :\w aparecem no primeiro plano / segundo plano do terminal.

  • \[033[48;5;XXXm3[38;5;YYYm define o plano de fundo / primeiro plano como XXX / YYY .

  • Para um script que despeja as cores disponíveis, tente colortest .

  • Para verificar a aparência do prompt:

    echo -e "<3[48;5;16m3[38;5;196mhost3[m:dir>$ "
    
por 29.08.2016 / 17:05
7

Se você não quiser (não pode) fazer os controles remotos terem um PS1 separado, então eu diria "não", seria pelo menos terrivelmente difícil. Considere que em uma conexão SSH o lado local não tem uma idéia real do que é um prompt de shell e o que é outra coisa, e assim a configuração de cores para o prompt realmente tem que vir do controle remoto. Você pode definir cores antes de iniciar a sessão, mas elas serão eficazes para toda a saída, ou seja, até que um ls ou um editor defina suas próprias cores.

É claro que você poderia criar algum wrapper para a sessão detectar tudo que parecesse um prompt e colori-lo, mas isso facilmente levaria a falsos positivos (cores em todas as linhas com $ ?) e seria terrivelmente complicado comparado a apenas soltar uma única linha em seu .profile ou .bashrc em cada máquina.

Com várias máquinas, pode ser útil, em qualquer caso, procurar soluções para sincronizar alterações de configuração em todas elas. Seja alguma ferramenta feita para isso, ou apenas um script, ou apenas executando um loop para copiar um (conjunto de) arquivo (s) de configuração em todos eles.

    
por 29.08.2016 / 08:48
5

Estou usando um script de wrapper com sshpass que primeiro carrega um perfil temporário e depois o ssh usando esse perfil (e exclui o arquivo temporário).

As duas principais coisas do script são estas:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null e ssh -t "${USER}"@"${IP}" "bash --rcfile /tmp/.bash_tmp; rm /tmp/.bash_tmp"

Usando isso, você pode definir facilmente as cores das sessões remotas.

Eu sei que isso não responde diretamente à sua pergunta, mas pode ser usado para resolvê-lo.

    
por 29.08.2016 / 08:58
1

Você pode estar interessado em context-color , que eu criei exatamente para isso: link

É um script simples que, quando executado, gera uma cor com base no hash de uma saída de comando. Com ele instalado em algum lugar no seu $PATH , você poderia fazer algo assim em seu .bashrc :

export PS1="$(context-color -p)$PS1\[\e[0m\]"

(onde --prompt/-p é o comutador para que a cor seja ignorada pelos prompts e \[\e[0m\] a seqüência de escape para redefinir a cor)

Por padrão, o comando usado para gerar o hash é whoami; hostname . Se você quiser apenas que a cor mude de acordo com o nome do host, poderá alterar o ambiente $CONTEXT variable ( export CONTEXT="hostname" ) ou simplesmente usar a opção --context/-c ( context-color -c "hostname" ).

Veja abaixo um exemplo:

    
por 01.06.2018 / 00:59