Por que ssh -nq -t não consegue ver minha variável de ambiente?

1

Estou executando um comando na máquina remota com o flag -t (para evitar que o comando bloqueie) o prompt (de alguma forma funciona dessa maneira). Então, estou usando ssh -nq -t root@ip , mas com isso, o script não consegue encontrar minha variável de ambiente que uso.

Por que isso está acontecendo e como posso evitar isso?

    
por Patryk 15.04.2013 / 11:05

1 resposta

1

EDITAR

As informações abaixo são válidas se você ssh na máquina e, em seguida, executar o comando que inicia um shell de login:

ssh root@ip
echo $XXXX_LICENSE_FILE

Se você está tentando acessar a variável diretamente do comando ssh ( ssh root@ip echo $XXXX_LICENSE_FILE ), então você está iniciando um shell não-login, não interativo , caso em que nem ~/.bash_profile nem ~/.bashrc são lidos. Na página bash man:

   When bash is started non-interactively, to run a shell script,
   for  example,  it looks for the variable BASH_ENV in the envi‐
   ronment, expands its value if it appears there, and  uses  the
   expanded  value  as  the  name  of a file to read and execute.
   Bash behaves as if the following command were executed:
          if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
   but the value of the PATH variable is not used to  search  for
   the file name.

A solução mais fácil seria simplesmente declarar a variável junto com o comando ssh . Para que isso funcione, você precisa adicionar esta linha ao arquivo /etc/ssh/sshd_config remoto:

PermitUserEnvironment yes

Em seguida, execute isso na máquina local:

XXXX_LICENSE_FILE=/etc/xxxx.lic && ssh -nq -t -t -t root@$ip /etc/init.d/xxxx.rc start

O problema aqui é a diferença entre o login e os shells interativos. Veja aqui para um bom resumo.

~/.bashrc é lido apenas ao iniciar um shell interativo (não-login). Quando você ssh em uma máquina remota, você está executando um shell login , então ~/.bash_profile ou ~/.bash_login ou ~/.profile (nessa ordem) são lidos. Você pode verificar isso executando bash depois de efetuar o logon no servidor remoto, que iniciará um shell interativo, ~/.bashrc será lido e sua variável de ambiente será configurada.

Para corrigir isso, defina a variável em seu ~/.bash_profile em vez de ~/.bashrc .

Estou assumindo que você está configurando a variável no controle remoto .bashrc e não no seu local. Se você deseja exportar uma variável local sobre ssh , dê uma olhada no link Postado por Frederik Deweerdt. A maneira mais fácil seria incluir sua variável na invocação de ssh :

ssh -nq -t root@ip "FOO=foo BAR=bar"
    
por 15.04.2013 / 17:28