Defina $ PS1 de maneira diferente no computador local e na sessão ssh

9

Eu mantenho meu diretório pessoal sob controle de versão, para que minha configuração básica esteja 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 user@host ~ $prompt de comando simples quando estiver sshem uma máquina remota.

Eu gostaria de poder atualizar o meu .profilepara que ele configure um complicado $PS1ao executar localmente e um simplificado ao executar em uma sshsessão.

Basicamente, eu gostaria de algo como uma $AM_I_LOGGED_IN_VIA_SSHvariável para testar no meu .profile. Isso é possível?

Will McCutchen
fonte

Respostas:

8

Quando você faz login via SSH, várias variáveis ​​de ambiente extras são definidas. Você pode usá-los como um teste para definir seu PS1 em seu perfil.

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi
Caleb
fonte
7

Se você verificar o seu ambiente ( env | grep SSH), você vai encontrar vários candidatos, como $SSH_CLIENT, $SSH_CONNECTION, e $SSH_TTY; a lista exata dependerá da sshdversão.

geekosaur
fonte
2

Se o seu sshd não estiver fornecendo variáveis ​​úteis, você poderá usar

ps -p $PPID

ou algum outro truque aleatório do ps (se o seu shell não estiver definido $PPID) para ver se o processo pai do shell é o seu processo de login remoto ou não. Então, se pai-é-coisa-remota, alterne $ PS1. Em seguida, baixe o OpenSSH e use as sugestões de geekosaur / Caleb porque seu servidor ssh é lixo. ;)

Ou, você pode usar a saída de "quem sou eu", pegar o último campo (por exemplo, $( who am i | awk '$0=$NF')) e verificar se o host é remoto ou local para decidir se você efetuou login local 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, poderá aproveitar o fato de que o $ PS1 é reavaliado após a execução. Portanto, você pode incluir um bloco condicional em linha para executar as coisas malucas do git se o seu cwd estiver dentro do repositório e algo mais fora. Por exemplo, aqui estou fazendo minha alteração imediata, 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 $ PS1 ficará louca no seu perfil, mas você só terá coisas super coloridas quando estiver no repositório git, enquanto tiver cores regulares em outros lugares. :) Observe que você precisa usar aspas simples na atribuição do PS1. Você não deseja que as variáveis ​​sejam expandidas quando o PS1 estiver atribuído; você deseja que eles sejam expandidos quando $ PS1 for avaliado posteriormente. Então, aspas simples.

dannysauer
fonte
1

Se PermitUserEnvironmentestiver ativado no sshd, você poderá usar ~/.ssh/environmentpara criar $PS1e detectar a presença de um valor em seu script que normalmente o define.

Ignacio Vazquez-Abrams
fonte
0

Como complemento à resposta de Ignacio, para deixar as coisas claras, a PermitUSerEnvironmentopção deve estar 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.

tymik
fonte