Quando você faz o login via SSH, diversas variáveis de ambiente extras são configuradas. Você poderia usá-los como um teste para definir seu PS1 em seu .profile.
if [ -n "$SSH_CLIENT" ]; then
PS1="Via ssh: "
else
PS1="Local: "
fi
Mantenho meu diretório pessoal sob controle de versão, para que minha configuração básica fique facilmente disponível em qualquer computador.
Meu prompt de comando bash no meu computador local é uma coisa complicada e colorida que inclui o repositório git atual e seu estado. Mas eu prefiro ter um simples prompt de comando user@host ~ $
quando eu ssh
em uma máquina remota.
Eu gostaria de poder atualizar meu .profile
para que ele configure um $PS1
complicado quando executado localmente e um simplificado quando executado em uma sessão ssh
.
Basicamente, gostaria de algo como uma variável $AM_I_LOGGED_IN_VIA_SSH
para testar no meu .profile
. Isso é possível?
Se você verificar seu ambiente ( env | grep SSH
), encontrará vários candidatos, como $SSH_CLIENT
, $SSH_CONNECTION
e $SSH_TTY
; A lista exata dependerá da versão sshd
.
Se o seu sshd não estiver fornecendo variáveis úteis, você pode usar
ps -p $PPID
ou algum outro truque ps aleatório (se seu shell não definir $PPID
) para ver se o processo pai do shell é o seu processo de login remoto ou não. Então, se pai-é-remoto-coisa mudar $ PS1. E então baixe o OpenSSH e use as sugestões do geekosaur / Caleb porque o seu servidor ssh é lixo. ;)
Ou, você pode usar a saída "who am i", pegar o último campo (por exemplo, $( who am i | awk '$0=$NF')
) e verificar se o host é remoto ou local para decidir se você fez login localmente ou remotamente.
Ou você pode ativar a saída de $(hostname)
para que seu shell use o $ PS1 apropriado em hosts específicos.
Ou, vamos realmente enlouquecer.
Se você estiver usando um shell moderno - como bash, ksh93 ou zsh, você pode aproveitar o fato de que $ PS1 é reavaliado na execução. Então, você poderia incluir um bloco condicional embutido para fazer as coisas loucas do git se seu cwd estiver dentro do repositório, e algo mais fora. Por exemplo, aqui estou fazendo minha alteração de prompt dependendo do diretório em que estou usando [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" )
, basicamente.
default prompt$ PS1='$(id -un) @ $(hostname)$( [[ $(pwd) = /tmp ]] && echo " [I am in /tmp]" || echo " /not/in/tmp")$ '
myname @ host /not/in/tmp$ cd /tmp
myname @ host [I am in /tmp]$ cd /etc
myname @ host /not/in/tmp$
Claro, a definição de $ PS1 parecerá louca em seu perfil, mas você só terá coisas super-coloridas-git quando estiver realmente no repositório git, enquanto tiver cores regulares em outro lugar. :) Note que você tem que usar aspas simples em torno da atribuição PS1. Você não quer que as variáveis sejam expandidas quando PS1 é atribuído; você deseja expandi-los quando $ PS1 for avaliado posteriormente. Então, aspas simples.
Se PermitUserEnvironment
estiver habilitado em sshd, você poderá usar ~/.ssh/environment
para criar $PS1
e, em seguida, apenas detectar a presença de um valor em seu script que normalmente o define.
Como complemento à resposta de Ignacio, para deixar as coisas claras, a opção PermitUSerEnvironment
deve ser ativada no lado do servidor para que isso funcione.
Se o servidor não ativar essa opção, você não terá uma sessão ssh colorida com esse servidor.