Quando entro ssh
em um servidor, como posso passar uma variável de ambiente do cliente para o servidor? Essa variável de ambiente é alterada entre diferentes invocações do ssh, portanto não quero sobrescrever $HOME/.ssh2/environment
toda vez que faço uma chamada ssh. Como posso fazer isso?
ssh
environment-variables
Ross Rogers
fonte
fonte
ssh
página de manual, não vejo outra maneira de fazer isso além de definir a variável manualmente após o login no servidor, a menos que você modifique ~ / .ssh2 / environment.Respostas:
Obviamente, você pode definir a variável de ambiente dentro do comando, no entanto, terá que ter cuidado ao citar: lembre-se de que seu shell analisará sua linha de comando local e, em seguida, o shell remoto analisará a string recebe.
Se você deseja que uma variável obtenha o mesmo valor no servidor que possui no cliente, tente a
SendEnv
opção:Isso requer suporte do servidor, no entanto. Com o OpenSSH, o nome da variável precisa ser autorizado
/etc/sshd_config
.Se o servidor permitir apenas determinados nomes de variáveis específicos, você poderá contornar isso; por exemplo, uma configuração comum permite
LC_*
, e você pode fazer o seguinte:Se even
LC_*
não for uma opção, você pode passar informações naTERM
variável de ambiente, que sempre é copiada (no entanto, pode haver um limite de comprimento). Você ainda precisará garantir que o shell remoto não restrinja aTERM
variável para designar um tipo de terminal conhecido. Passe a-t
opção para ssh se você não estiver iniciando um shell interativo remoto.Outra possibilidade é definir a variável diretamente no comando:
Assim, se passar uma variável local:
No entanto, cuidado com os problemas de citação: o valor da variável será interpolado diretamente no snippet do shell executado no lado remoto. O último exemplo acima assume que
$LOCALVAR
não contém aspas simples ('
).fonte
AcceptEnv
diretivassshd_config
conforme desejado pelo administrador. MasTERM
é tratado especialmente, tanto quanto eu sei que não há como filtrá-lo no lado do servidor (ele é definido no ambiente do shell, independentemente de qualquer configuração). Tem certeza de que não há um script de perfil substituindo-o (como/etc/profile
ou~/.profile
ou~/.bashrc
)?TERM
só é transmitido se o cliente solicitar que o servidor aloque um tty. Se não houver terminal no lado remoto, seria inútil transmitirTERM
. Ao especificar um comando, se você quiser ter um terminal no lado remoto, precisará da-t
opção de linha de comando (ouRequestTTY
dentro~/.ssh/config
).Se você pode administrar o host de destino, pode configurar o sshd para permitir a passagem de suas variáveis de ambiente local para o host de destino.
Na página do manual sshd_config:
configuração sshd normalmente vive em
/etc/ssh/sshd_config
fonte
Então, no seu cliente, você tem alguma variável de ambiente e deseja que ela esteja disponível para o comando remoto? Eu não acho que exista uma maneira de o ssh passar magicamente, mas você provavelmente pode fazer algo assim. Em vez de usar, diga:
Você consegue fazer isso:
fonte
A resposta do @ emptyset (que não funcionou para mim) me levou a esta resposta:
Você pode adicionar este comando ao seu
~/.ssh/authorized_keys
arquivo:export VARIABLE=<something>
estava saindo imediatamente e a conexão SSH foi fechada (me bloqueando do servidor), enquanto/usr/bin/env ... $SHELL
executará seu shell padrão com um ambiente modificado.fonte
$SHELL
por um shell real? Verifique também se / usr / bin / env existe no servidor. No entanto, a solução não é perfeita: notei que ele travou quando eu queria usarscp
ou um comando embutido.PermitUserEnvironment yes
e usando emenvironment="..."
vez decommand="..."
.No seu cliente local,
~/.ssh/config
você pode adicionarSetEnv
, por exemplo,Nota: Verifique
man ssh_config
.Em seguida, no servidor, certifique-se de permitir que o cliente passe certas variáveis de ambiente no seu
/etc/ssh/sshd_config
arquivo de configuração:Nota: Verifique
man sshd_config
.fonte
Você pode tentar chamar um comando personalizado, supondo que você tenha uma configuração de login ssh sem senha. No servidor, edite sua entrada ~ / .ssh / allowed_keys que corresponde à chave do seu cliente:
Veja este link na seção Comando Forçado para um pouco mais de detalhes.
fonte
Eu estava criando uma compilação personalizada do OpenSSH para um dispositivo com cramfs no diretório inicial e / etc (o Cram FS é somente leitura) para que o ~ / .ssh / environment não funcionasse sem reconstruir o FS inteiro e estes foram implantados em campo dispositivos (sistemas embarcados, daí o uso de CRAMFS). Você pode especificar no sshd_config a localização do arquivo authroized_keys, mas por alguma razão o environment = funciona apenas para variáveis de ambiente nas ~ / .ssh / authroized_keys. Editar o perfil / etc / não era uma opção e eu tive que carregar o ssh em um diretório não padrão. Em session.c após o child_set_env (... "MAIL" ...), basta adicionar as variáveis de ambiente necessárias (este é um truque, eu sei ...), mas apenas 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
fonte
apenas um comando simples:
fonte