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

9

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?

    
por Will McCutchen 21.06.2011 / 22:06

5 respostas

8

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
    
por 21.06.2011 / 22:10
7

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 .

    
por 21.06.2011 / 22:10
2

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.

    
por 21.06.2011 / 22:56
1

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.

    
por 21.06.2011 / 23:00
0

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.

    
por 03.08.2015 / 08:44

Tags