Formas alternativas de passar a variável env do PS1 para o Ubuntu para a sessão SSH

1

Eu sei que existem vinte mil respostas, nenhuma delas funcionou como esperado, estou mais surpreso do que você, então, por favor, considere ler a história primeiro.

Estou tentando conseguir o que parece ser uma coisa básica: enviar a variável local PS1 para o Ubuntu 14.04.1 quando estiver usando o SSH em um Mac. Eu sei que existem duas maneiras de fazer isso:

  1. Usando a diretiva SendEnv dentro de / etc / ssh_config,
  2. Usando um comando com SSH, algo como ssh host -t "PS1='"$PS1"'; exec bash" .

Ambas as rotas são bem descritas em outras respostas do SE e há muitos resultados no Google. Mas nenhum parece funcionar para mim como esperado.

A primeira opção não funciona, eu configurei AcceptEnv PS1 e PermitUserEnvironment yes em / etc / ssh / sshd_config no Ubuntu. Se eu tentar passar qualquer outra variável, isso funciona como esperado. Eu olhei em ~/.bashrc e ~/.profile e parece ter um monte de atribuições de PS1 . Ele é redefinido lá e, se isso acontecer, como evitar que isso aconteça?

A segunda opção também não funciona, mas, novamente, funciona com qualquer outro nome de variável. Se eu fizer export ABC=123; exec bash no login do SSH, posso ver ABC nas variáveis definidas, se eu fizer o mesmo com PS1 , sempre será padronizado como \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ . Outro problema com a segunda solução é que algumas variáveis de ambiente não são carregadas quando eu executo exec bash , eu tentei com --login e --interactive opções, tentei obter . ~/.profile e . ~/.bashrc , mas não consigo a mesma saída no login (banner e estatísticas do Ubuntu) quando eu entro em log e as variáveis permanecem indefinidas (assim como aliases e outras coisas úteis eu assumo?).

Eu quero saber como definir meus estilos de prompt definidos no local PS1 em uma conexão recente do Ubuntu em SSH. Alterar a configuração relacionada ao PS1 no Ubuntu NÃO é uma opção , eu explicitamente quero passar a configuração do meu cliente, então eu não faço a mesma coisa vinte vezes.

    
por Ian Bytchek 17.11.2014 / 17:56

1 resposta

1

I've looked into ~/.bashrc and ~/.profile and it seems to have a lot of PS1 assignments. Does it get redefined there and if it does, how to prevent this from happening?

Sim, é redefinido. Ambos os métodos definem a variável inicialmente, mas não importa uma vez bash origina qualquer arquivo que redefina PS1 .

Para evitar que isso aconteça,

  • ou faça o controle remoto bash detectar se você está conectado com ssh e não alterar PS1 neste caso; isso pode exigir grandes mudanças nesses arquivos originados e você não quer fazer isso;
  • ou permite que o controle remoto bash defina PS1 de qualquer forma atual, mas substitua no final ; este parece ser um método muito melhor.

Adicione a seguinte linha no final do seu .bashrc na máquina remota:

[ -n "$PS1_ovrrde" ] && PS1="$PS1_ovrrde"

Agora, tudo o que você precisa fazer é definir PS1_ovrrde no lado remoto quando fizer login via SSH. Você já conhece duas maneiras. Notas:

  1. Com SendEnv você precisa de PS1_ovrrde para estar em seu ambiente local, eu acho. Adicione export PS1_ovrrde="$PS1" no final do seu local .bashrc .
  2. Com exec bash , você precisa exportar PS1_ovrrde para o ambiente remoto: ssh host -t "export PS1_ovrrde=..." . Variáveis que já estão no ambiente remoto não precisam ser exportadas novamente, mas aqui você está criando uma nova variável.
por 31.07.2018 / 09:59