Solicitação do Bash para alterar a cor quando estou conectado a um servidor

15

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

Então, eu quero que a cor fique verde quando estiver no meu sistema e mude para vermelho quando conectado aos servidores. Eu tenho um grande número de servidores que não quero colocar de diferente .bashrcem todos eles.

nitinas
fonte
Provavelmente não. Mas voltando a ele superuser.com/questions/33712/…
random
1
Por que não deixar seu terminal vermelho (ou alguma outra cor) para que, quando você se conecte a eles, obtenha um branco padrão?
Reinstate Monica - ζ-- 29/08

Respostas:

9

O prompt do controle remoto é definido pelo controle remoto ~/.bashrc. Então você ainda precisa copiá-lo para o servidor remoto. No entanto, você pode usar um único ~/.bashrcpara 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='\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 defina PS1se ainda não estiver definido (ou seja, se o shell não for interativo). Testar se PS1não está vazio é uma maneira muito comum de decidir se o shell é interativo e você não deseja confundir os programas que fazem isso. (Provavelmente, um teste mais preciso está verificando se $-contém i.)

  • Se você deseja que esse código seja executado ao fazer login em um servidor remoto, você deve sempre ter um dos arquivos de perfil de origem ~/.bashrc. Mas suponho que você saiba disso.

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

  • \[033[mredefine o primeiro plano e o plano de fundo para o padrão. Então, aqui, :\wapareça no primeiro plano / plano de fundo do terminal.

  • \[033[48;5;XXXm\033[38;5;YYYmdefine 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>$ "
Matei David
fonte
7

Se você não quiser (não puder) tornar os controles remotos separados PS1, eu diria "não", seria pelo menos terrivelmente difícil. Considere que, em uma conexão SSH, o lado local não tem idéia real do que é um prompt de shell e o que é outra coisa; portanto, a configuração de cores para o prompt realmente precisa 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 lsum editor ou um editor defina as cores próprias.

É claro que você poderia criar um invólucro para a sessão para detectar tudo que parecesse um prompt e colori-lo, mas isso levaria facilmente a falsos positivos (cores em todas as linhas com a $?) E seria muito complicado se comparado a apenas soltar um linha única para o seu .profileou .bashrcem cada máquina.

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

ilkkachu
fonte
2
Esse último parágrafo é a chave. Se o OP estiver administrando "um grande número de servidores", é surpreendente que cada um precise ser configurado individualmente.
Lightness Races com Monica
5

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

As duas coisas principais 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.

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

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

Você pode estar interessado context-color, que reuni para esse fim 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 do seu $PATH, você pode fazer algo assim no seu .bashrc:

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

(onde --prompt/-pestá a opção para que a cor seja escapada para prompts e \[\e[0m\]a sequência de escape para redefinir a cor)

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

Veja abaixo um exemplo:

demonstração

Ramnes
fonte