Tive problemas com pessoas fazendo login em alguns servidores via ssh e esquecendo que um terminal específico não é mais local. Hoje alguém tentou desligar seu laptop sudo shutdown -h now
e acidentalmente derrubou um servidor.
Eu gostaria de mudar a cor do bash PS1
nesses servidores quando estiver logado via ssh
. Eu controlo esses servidores através de um pacote debian que envio para eles.
Qual é a melhor maneira de implementar um padrão PS1 em todo o site?
A resposta óbvia é criar um arquivo /etc/profile.d/sshcolours
com este conteúdo para deixar o user@host roxo:
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] ; then
PS1='\[\033[01;35m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
fi
bash
irá ler isso via /etc/profile
(quais fontes /etc/profile.d/*
). No entanto, mais tarde ele lerá ~/.bashrc
o que provavelmente será substituído PS1
com base $TERM
no definido em /etc/skel/.bashrc
.
Existe alguma maneira de arquivar source
meu site em todo o site ~/.bashrc
sem tocar ~/.bashrc
e sem forçar minha equipe a adotar uma mudança no lado do cliente?
Aqui estão algumas ideias ruins:
Depois de definir
$PS1
,~/.bashrc
condicionalmente fontes/usr/share/bash-completion/completions/*
, para que eu pudesse colocar meu arquivo lá. Mas alguns testes me mostraram que a condição não foi atendida ou/usr/share/bash-completion/bash_completion
reverteu o ambiente.Em
postinst
eu poderia anexar uma linha para fornecer meu arquivo ao arquivo~/.bashrc
. Isso parece ilegal e problemático:
for h in /home/*; do
if [ ! grep -q profile_amendments "$h/.bashrc" ] ; then
echo ". /etc/profile_amendments" >> "$h/.bashrc"
fi
done
Você explicou que seus usuários precisam poder realizar operações privilegiadas nos servidores remotos. Não vejo uma maneira de substituir seus prompts, cores de tela etc. sem a cooperação deles. Você poderia pedir que eles adicionassem um
. /etc/profile_amendments
ao final dos arquivos.bashrc
e.bash_profile
, por exemplo, mas não conheço nenhuma maneira de impor isso.O restante não responde diretamente à sua pergunta, mas pensa mais em soluções alternativas. Talvez modificar a
sudo
configuração possa ajudar. Por exemplo, usarvisudo /etc/sudoers.d/lecture
para criar um arquivo como este pode ajudar:Você então o complementaria com o conteúdo do texto de
/usr/local/etc/sudo-lecture.txt
Referências
Se seus usuários definirem suas preferências
$PS1
,~/.bashrc
mas não definirem a$PROMPT_COMMAND
variável, você poderá adicionar:Para
/etc/bash.bashrc
(ou equivalente em seu sistema) que um roxo[SSH]
seja anexado$PS1
logo antes do primeiro prompt.Em qualquer caso,
/etc/profile
é o arquivo de configuração da sessão, não o arquivo de personalização do shell.No bash 5.1 ou mais recente,
$PROMPT_COMMAND
agora pode ser um array (que lembra o$precmd_functions
array do zsh), então você pode anexar a esse array e remover apenas esse elemento do array no código. Como sempre, é mais complicado onde os arrays são esparsos e obter o índice do último elemento é um tanto estranho:Como você sugeriu, contanto que o restante
/etc/bash.bashrc
(antes ou depois desse código) e os usuários~/.bashrc
também usemPROMPT_COMMAND+=('code')
para adicionar código em$PROMPT_COMMAND
vez de substituí-lo totalmente, isso evitará que esses códigos sejam removidos comounset -v PROMPT_COMMAND
faria na abordagem anterior.Em vez de alterar o prompt, alguma outra abordagem poderia ser alterar as cores de fundo e de primeiro plano padrão do terminal (assumindo que os usuários usem
xterm
emuladores de terminal semelhantes a -), como:Para preto em roxo claro ou
Para branco sobre roxo escuro, se os usuários preferirem fundos escuros.
Você também pode adicionar
\e]12;#ff0000\e\\
para tornar o cursor vermelho brilhante ou alterar a fonte, etc.Se você deseja forçar os clientes a executar seu shell em uma sessão tmux, você pode gerar uma sessão tmux no final de
/etc/profile
, antes de~/.bashrc
ser originado, colorindo a barra inferior, para que qualquer alteração no prompt feita pelos usuários~/.bashrc
seja não substitua a sugestão visual.Ou seja, algo como:
No fim de
/etc/profile
; por padrão, isso gerará uma sessão tmux com uma barra inferior verde.Os guardas estão em vigor para evitar a geração de instâncias do tmux se
/etc/profile
não estiverem sendo originadas de uma instância Bash em execução em um terminal e para evitar a geração recursiva de instâncias do tmux.exit "$?"
sairá/etc/profile
retornando o código de saída do tmux.Neste exemplo, o prompt é definido por
~/.zshrc
, que é uma versão modificada do Grml~/.zshrc
, mas a barra inferior é definida por tmux in/etc/zprofile
.As modificações feitas por
~/.zshrc
ainda se aplicam, e não importa como eu mude~/.zshrc
: a barra inferior permanecerá. O mesmo princípio se aplicará a~/.bashrc
//etc/profile
.Como um bônus adicional, plagiando-me no Ask Ubuntu (leia a resposta para obter detalhes e limites deste método), você pode expandir isso para que a barra inferior seja automaticamente definida para uma cor específica da pseudo-máquina, para simplificar a implantação do modificação em servidores diferentes caso você deseje que a cor da barra inferior identifique pseudo-exclusivamente cada servidor: