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


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

Então, eu 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 diferente .bashrc em todos aqueles.


12


origem


Provavelmente não. Mas voltando a isso superuser.com/questions/33712/… - random♦
Por que não deixar seu terminal vermelho (ou alguma outra cor) para que, ao se conectar a eles, você obtenha um branco padrão? - hexafraction


Respostas:


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 defina a cor do prompt com base no nome do host:

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

Notas:

  • Não definir PS1 se ainda não estiver definido (ou seja, se o shell não for interativo). Testando 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 você deseja que esse código seja executado ao efetuar login em um servidor remoto, você deve ter um dos arquivos de perfil sempre ~/.bashrc. Mas eu suponho que você saiba disso.

  • Dentro PS1, os códigos de escape devem ser incluídos \[...\].

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

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

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

  • Para verificar como seria o prompt:

    echo -e "<\033[48;5;16m\033[38;5;196mhost\033[m:dir>$ "
    

8





Se você não quiser (não pode) fazer com que os controles remotos tenham um PS1entã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 todas as saídas, ou seja, até ls ou um editor define 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 levaria facilmente a falsos positivos (cores em todas as linhas com um $?) e ser muito complicado em comparação com apenas soltando uma única linha para o 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.


7



Esse último parágrafo é a chave. Se o OP estiver administrando "um grande número de servidores", é surpreendente que cada um tenha que ser configurado individualmente. - Lightness Races in Orbit


Eu estou usando um script wrapper com sshpass que primeiro carrega um perfil temporário e, em seguida, ssh usando esse perfil (e excluir o arquivo temporário).

As duas principais coisas do script são estas:
scp ~/.bash_remote "${USER}"@"${IP}":/tmp/.bash_tmp 1>/dev/null
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 a sua pergunta, mas pode ser usado para resolvê-lo.


5



Não use sshpass -p se tudo for possível! Os argumentos da linha de comando para executar programas geralmente são visíveis para todos os usuários pse assim será a senha. Mesmo se você não tiver outras contas de usuário na máquina, poderá imprimi-las na tela acidentalmente. sshpass pode ler a senha de uma variável de ambiente, que não é muito difícil de usar. Além disso, considere as chaves ssh se você for salvar as credenciais de login em um arquivo de qualquer maneira. - ilkkachu
Você está certo e eu não estava tentando promover o uso dele. Eu estava apenas colando como um exemplo do meu script que está sendo usado apenas para fins de desenvolvimento e não oferece nenhum risco de segurança. A variável SSHPASS será deixada vazia para sistemas de produção onde as chaves ssh são usadas. Vou atualizar. - Mikael Kjær


Você pode estar interessado em context-color, que eu montei para esse propósito exato: https://github.com/ramnes/context-color

É 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 interruptor de modo que a cor é escapada por 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ê quer apenas que a cor mude de acordo com o nome do host, você pode alterar o $CONTEXT ambiente variável (export CONTEXT="hostname") ou simplesmente use o --context/-c opção (context-color -c "hostname").

Veja abaixo um exemplo:

demo


1