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 .bashrc
em todos eles.
Respostas:
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~/.bashrc
para todos os hosts e definir a cor do prompt com base no nome do host:Notas:
Não defina
PS1
se ainda não estiver definido (ou seja, se o shell não for interativo). Testar sePS1
nã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émi
.)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[m
redefine o primeiro plano e o plano de fundo para o padrão. Então, aqui,:\w
apareça no primeiro plano / plano de fundo do terminal.\[033[48;5;XXXm\033[38;5;YYYm
define o plano de fundo / primeiro plano paraXXX
/YYY
.Para um script que despeja as cores disponíveis, tente
colortest
.Para verificar como seria o prompt:
fonte
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é quels
um 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.profile
ou.bashrc
em 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.
fonte
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.
fonte
sshpass -p
se possível! Os argumentos da linha de comando para a execução de programas geralmente são visíveis para todos os usuáriosps
, 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.sshpass
pode 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.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
:(onde
--prompt/-p
está 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$CONTEXT
variável environment (export CONTEXT="hostname"
) ou simplesmente usar a--context/-c
opção (context-color -c "hostname"
).Veja abaixo um exemplo:
fonte