As variáveis de ambiente não estão disponíveis ao executar scripts sobre o ssh

4

Suponha que eu tenha dois hosts: A e B com os usuários a e b. B é uma máquina Windows com o Cygwin instalado, se isso for importante.

B está configurado para ser acessado de A a SSH sem senha (ele contém a chave RCA pública de A), para que eu possa executar comandos a partir dele da seguinte maneira:

ssh b@B [command]

Mas quando tento executar um comando, que requer acesso a uma variável de ambiente, o comando falha:

[15:54:08] - a@A - ~
$ ssh b@B 'echo $ANT_HOME'

retorna uma string vazia.

O mesmo comando, se conectado diretamente (não através de SSH) é executado corretamente:

b@B ~
$ echo $ANT_HOME
/cygdrive/c/PROGRA~1/apache-ant-1.9.0

O último é possível porque as variáveis relevantes foram exportadas em "bash_profile":

export JAVA_HOME="/cygdrive/c/PROGRA~1/Java/jdk1.7.0_45"
export ANT_HOME="/cygdrive/c/PROGRA~1/apache-ant-1.9.0"

mas, por algum motivo, isso não é aplicado ao caso SSH.

Algumas informações adicionais que podem ser úteis.

O host B possui o Windows XP + Cygwin. O sshd CYGWIN é executado na conta SYSTEM. JAVA_HOME e ANT_HOME são definidos na parte de variáveis de ambiente "sistema" no Windows.

Quando eu executo o comando "$ ssh b @ B env", ele não imprime ANT_HOME ou JAVA_HOME, mas se eu incluí-los no arquivo sshd_config, isso ocorre. Mas, mesmo assim, o comando simples ssh b @ B 'echo $ ANT_HOME' não funciona como seria de esperar.

Por favor, me dê uma dica do que precisa ser feito para executar o comando através do SSH.

    
por Silver 03.04.2014 / 13:17

2 respostas

1

Nas páginas do manual do meu servidor:

  1. Lê o arquivo ~ / .ssh / environment, se existir, e os usuários podem alterar seu ambiente. Veja a opção PermitUserEnvironment em sshd_config (5).

Você precisa declarar as variáveis de ambiente e permiti-las no local do servidor remoto /etc/ssh/sshd_config , ativando a propriedade PermitUserEnvironment como PermitUserEnvironment yes e definindo suas variáveis de ambiente em ~ / .ssh / environment.

    
por 03.04.2014 / 13:49
3

Quando você executa um comando como um argumento para o ssh, o comando é executado diretamente pelo sshd; o shell não está envolvido.

Você pode verificar isso usando algo como o seguinte:

ssh b @ B pstree

É o shell (bash neste caso) que extrai o seu .bash_profile, e só o faz se o shell for invocado como um shell de login, ou se o shell foi invocado com a opção --login (veja o bash man page; procure por INVOCATION). O ambiente que você obtém ao executar um comando diretamente é definido por coisas como sshd e PAM quando você faz o login.

Assim, se você quer seu .bash_profile, você precisa executá-lo sob o shell e você precisa rodar o shell como um shell interativo ou de login, assim:

ssh b @ B "bash -l -c 'env'"

Isso deve gerar a saída desejada. A única coisa a observar é que a citação fica complicada rapidamente. Note que no Linux, pelo menos,

ssh b @ B bash -l -c 'env'

não lhe dará um shell de login (não sei por que).

    
por 03.04.2014 / 13:48