Quando ssh'ing, como posso definir uma variável de ambiente no servidor que muda de sessão para sessão?

82

Quando eu ssh em um servidor, como posso passar uma variável de ambiente do cliente para o servidor? Esta variável de ambiente muda entre diferentes invocações de ssh, então eu não quero sobrescrever $HOME/.ssh2/environment toda vez que eu faço uma chamada ssh. Como posso fazer isso?

    
por Ross Rogers 13.07.2010 / 18:59

6 respostas

98

Naturalmente, você pode definir a variável de ambiente dentro do comando, mas você terá que ter cuidado com as citações: lembre-se de que seu shell vai analisar sua linha de comando local, e então o shell remoto vai continuar a string que recebe.

Se você quiser que uma variável obtenha o mesmo valor no servidor que ela tem no cliente, tente a opção SendEnv :

ssh -o SendEnv=MYVAR server.example.com mycommand

Isso requer suporte do servidor, no entanto. Com o OpenSSH, o nome da variável deve ser autorizado em /etc/sshd_config .

Se o servidor permitir apenas determinados nomes de variáveis específicas, você poderá contornar isso; por exemplo, uma configuração comum permite LC_* through e você pode fazer o seguinte:

ssh -o SendEnv=LC_MYVAR server.example.com 'MYVAR=$LC_MYVAR; unset LC_MYVAR; export MYVAR; mycommand'

Se mesmo LC_* não for uma opção, você poderá passar informações na variável de ambiente TERM , que é sempre copiada (no entanto, pode haver um limite de comprimento). Você ainda terá que se certificar de que o shell remoto não restringe a variável TERM para designar um tipo de terminal conhecido. Passe a opção -t para ssh se você não estiver iniciando um shell interativo remoto.

env TERM="extra information:$TERM" ssh -t server.example.com 'MYVAR=${TERM%:*}; TERM=${TERM##*:}; export MYVAR; mycommand'

Outra possibilidade é definir a variável diretamente no comando:

ssh -t server.example.com 'export MYVAR="extra information"; mycommand'

Assim, se passar uma variável local:

ssh -t server.example.com 'export MYVAR='"'$LOCALVAR'"'; mycommand'

No entanto, tenha cuidado com as questões de cotação: o valor da variável será interpolado diretamente no fragmento de shell executado no lado remoto. O último exemplo acima assume que $LOCALVAR não contém nenhuma aspas simples ( ' ).

    
por 13.07.2010 / 21:25
12

Se você puder administrar o host de destino, poderá configurar o sshd para permitir a passagem de variáveis de ambiente local para o host de destino.

Na página do manual sshd_config:

 PermitUserEnvironment
     Specifies whether ~/.ssh/environment and environment= options in
     ~/.ssh/authorized_keys are processed by sshd.  The default is
     "no".  Enabling environment processing may enable users to bypass
     access restrictions in some configurations using mechanisms such
     as LD_PRELOAD.
A configuração do

sshd normalmente vive em /etc/ssh/sshd_config

    
por 03.02.2012 / 18:09
6

Então, no seu cliente, você tem alguma variável de ambiente e quer que ela esteja disponível para o comando remoto? Eu não acho que há uma maneira de ter ssh magicamente passando adiante, mas você provavelmente pode fazer algo assim. Em vez de usar, diga:

ssh remote.host my_command

Você pode fazer isso:

ssh remote.host env ENV_VAR=$ENV_VAR my_command
    
por 13.07.2010 / 19:52
2

@ resposta do emptyset (que não funcionou para mim) me levou a esta resposta:

Você pode adicionar este comando ao seu arquivo ~/.ssh/authorized_keys :

command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>

export VARIABLE=<something> foi imediatamente encerrado e a conexão SSH foi fechada (bloqueando-me fora do servidor), enquanto /usr/bin/env ... $SHELL executará seu shell padrão com um ambiente modificado.

    
por 14.05.2018 / 16:36
1

Você pode tentar invocar um comando personalizado, supondo que você tenha uma configuração de login ssh sem senha. No servidor, edite sua entrada ~ / .ssh / authorized_keys que corresponde à chave do seu cliente:

command="export VARIABLE=<something>" ssh-rsa <key>

Veja este link na seção Comando forçado para um pouco mais de detalhe.

    
por 13.07.2010 / 19:15
1

Eu estava fazendo uma compilação personalizada do OpenSSH para um dispositivo com cramfs no diretório inicial e / etc (o Cram FS é somente leitura), portanto o ~ / .ssh / environment não funcionaria sem a reconstrução de todo o FS e estes foram implantados em campo dispositivos (Sistemas Embarcados Por isso, o uso de CRAMFS). Você pode especificar no sshd_config a localização do arquivo authroized_keys, mas por alguma razão o ambiente = só funciona para variáveis de ambiente no ~ / .ssh / authroized_keys. Editar o / etc / profile não era uma opção e eu tive que carregar o ssh em um diretório não-padrão. Na sessão.c após o child_set_env (... "MAIL" ...) basta adicionar as variáveis de ambiente que você precisa (Isso é um hack que eu conheço ...) mas apenas se alguém precisar de alguns envs codificados para uma sessão se você estiver compilando a partir da fonte você pode fazer isso. TGI-FLOSS

    
por 28.08.2015 / 18:55