ssh ignora variáveis em arquivos de perfil

1

Pedimos desculpas por essa vaga pergunta com antecedência, mas não sei como reduzir isso.

Estou no Ubuntu 14.04.5 LTS, usando OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.10, OpenSSL 1.0.1f 6 Jan 2014 como meu cliente ssh. Eu configurei o ssh sem senha de acordo com estas instruções: link .

Agora, o ssh funciona como esperado, exceto todas as variáveis que eu defino em .bashrc ou .profile são ignoradas (sim, estou ciente de que .profile sources .bashrc ). Todas as postagens relacionadas a esse problema que eu encontrei em askubuntu.com, ou stackexchange ou algo semelhante, não resolveram esse problema.

Variáveis locais existem na máquina local e na máquina remota, mas quando eu ssh na máquina remota, elas não estão lá, o que significa que elas estão faltando na saída de 'ssh ab.cd.efg. hij env '; da mesma forma, ssh ab.cd.efg.hij 'echo $LOCAL_VARIABLE' não fornece saída.

Qual poderia ser o motivo desse comportamento?

EDITAR

Eu não tinha .bash_profile ou .bash_login na máquina remota, como solicitado pela steeldriver. Eu adicionei export LOCAL_VARIABLE=foo a um e depois ao outro, mas ele ainda está faltando em 'ssh ab.cd.efg.hij env' e ssh ab.cd.efg.hij 'echo $LOCAL_VARIABLE' .

    
por Markus Heller 21.03.2018 / 21:46

1 resposta

1

O Bash lê .profile * quando é executado como um shell de login interativo. Quando um comando é dado para execução, ou ao executar um script, ele não é interativo, a menos que você forneça a opção -i e não-login, a menos que você forneça a opção -l , etc. executando comandos via SSH.

O Bash lê .bashrc quando executado de forma não interativa pelo SSH. No entanto, o .bashrc padrão inclui uma verificação para uso interativo:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Portanto, nenhuma variável definida em .profile ou .bashrc está disponível quando você executa ssh foo some-command . Você pode colocar as variáveis em .bashrc antes da verificação da execução interativa. Por exemplo:

$ head ~/.bashrc
echo foo
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
$ ssh localhost env
foo
LC_MEASUREMENT=en_GB.UTF-8
SSH_CONNECTION=127.0.0.1 46916 127.0.0.1 22
LC_PAPER=en_GB.UTF-8
LC_MONETARY=en_GB.UTF-8
LANG=en_GB.UTF-8
LC_NAME=en_GB.UTF-8
XDG_SESSION_ID=155
USER=muru
...

O echo foo foi executado. Se eu tivesse export foo=bar , então foo teria aparecido na saída env .

* com advertências adequadas sobre a presença de arquivos como .bash_profile , etc.

    
por muru 22.03.2018 / 01:45