2010-07-13 16:59:57 +0000 2010-07-13 16:59:57 +0000
95
95

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

Quando ssh para 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 para não querer sobrepor $HOME/.ssh2/environment cada vez que faço uma chamada ssh. Como é que posso fazer isto?

Respostas (8)

116
116
116
2010-07-13 19:25:13 +0000

É claro que pode definir a variável de ambiente dentro do comando, no entanto terá de ter cuidado ao citar: lembre-se de que a sua concha vai analisar a sua linha de comando local, e depois a concha remota terá um movimento sobre a corda que recebe.

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

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

Isto requer, no entanto, o apoio do servidor. Com OpenSSH, o nome da variável tem de ser autorizado em /etc/sshd_config.

Se o servidor permitir apenas certos nomes de variáveis específicas, pode contornar isso; por exemplo, uma configuração comum permite LC_* através, e 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, pode passar informação na variável TERM de ambiente, que é sempre copiada (pode haver, no entanto, um limite de comprimento). Terá ainda de se certificar de que a shell remota não restringe a variável TERM para designar um tipo de terminal conhecido. Passe a opção -t para ssh se não estiver a iniciar uma shell interactiva remota.

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

Outra possibilidade é definir a variável directamente 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'

Contudo, cuidado com as questões de citação: o valor da variável será interpolado directamente para o snippet da concha executado no lado remoto. O último exemplo acima assume que $LOCALVAR não contém nenhuma aspas simples (').

12
12
12
2012-02-03 17:09:54 +0000

Se puder administrar o anfitrião alvo, pode configurar o sshd para permitir a passagem das variáveis do seu ambiente local para o anfitrião alvo.

A partir da página man 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.

configuração sshd vive tipicamente em /etc/ssh/sshd_config

6
6
6
2010-07-13 17:52:27 +0000

Então, no seu cliente, tem alguma variável de ambiente, e quer que esta esteja disponível para o comando remoto? Não creio que haja uma forma de o ssh passar por magia, mas provavelmente pode fazer algo do género. Em vez de usar, digamos:

ssh remote.host my_command

Pode fazer isto:

ssh remote.host env ENV_VAR=$ENV_VAR my_command

0x1&

4
4
4
2019-06-12 10:45:04 +0000

No seu cliente local, no seu ~/.ssh/config pode adicionar SetEnv, por exemplo

Host myhost
  SetEnv FOO=bar

Nota: Verifique man ssh_config.

depois no servidor, certifique-se de permitir ao cliente passar certas variáveis de ambiente no seu ficheiro /etc/ssh/sshd_config config:

AcceptEnv LANG LC_* FOO BAR*

Nota: Verifique man sshd_config.

3
3
3
2018-05-14 14:36:55 +0000

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

Pode adicionar este comando ao seu ficheiro ~/.ssh/authorized_keys:

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

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

1
1
1
2010-07-13 17:15:31 +0000

Pode tentar invocar um comando personalizado, assumindo que tem uma configuração de login ssh sem palavra-passe. No servidor, edite a sua ~/.ssh/authorized_keys entry que corresponde à chave do seu cliente:

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

Olhe para este link na secção Comando Forçado para um pouco mais de detalhe.

1
1
1
2015-08-28 16:55:01 +0000

Estava a fazer uma construção personalizada de OpenSSH para um dispositivo com cramfs no directório home e /etc (Cram FS é apenas leitura) pelo que ~/.ssh/ambiente não funcionaria sem reconstruir todo o FS e estes eram dispositivos implantados em campo (Sistemas Embutidos Daí o uso de CRAMFS). É possível especificar no sshd_configurar a localização do ficheiro authroized{keys_keys mas por alguma razão o ambiente= só funciona para variáveis de ambiente nas ~/.ssh/authroized_keys. A edição do ficheiro /etc/profile não era uma opção e tive de carregar o ssh num directório não-padrão. Em session.c depois da criança_set_env(… “MAIL”…) basta adicionar as variáveis de ambiente de que precisa(Este é um hack que eu conheço…) mas apenas incase alguém precisa de algumas invejas hardcoded para uma sessão se estiver a compilar a partir da fonte, pode fazer isto. TGI-FLOSS

0
0
0
2019-04-11 17:12:11 +0000

apenas um simples comando :

ssh -t your_host_or_ip 'export some_var_name=whatever_you_want; bash'