Como posso passar uma variável de ambiente através de um comando ssh? [duplicado]

32

Como posso passar um valor para um comando ssh, de modo que o ambiente que é iniciado na máquina host comece com uma determinada variável de ambiente definida para minha escolha?

EDITAR: O objetivo é passar a atual área de trabalho do kde (do dcop kwin KWinInterface currentDesktop) para o novo shell criado para que eu possa repassar um local do nfs para o meu JEdit no servidor original, exclusivo para cada área de trabalho do KDE. (Usando um mecanismo como emacsserver / emacsclient )

A razão pela qual múltiplos instâncias de ssh podem estar em operação ao mesmo tempo é porque quando estou configurando meu ambiente, estou abrindo um monte de instâncias ssh diferentes para máquinas diferentes.

    
por Ross Rogers 30.09.2009 / 00:56

5 respostas

13

O arquivo ~/.ssh/environment pode ser usado para definir variáveis que você deseja disponibilizar para comandos remotos. Você terá que habilitar PermitUserEnvironment na configuração do sshd.

Variáveis definidas dessa maneira são exportadas para processos filhos, portanto você pode:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

e o myscript saberão que Foo é Bar e Joe tem 37 anos.

    
por 30.09.2009 / 01:02
43

A opção SendEnv é seu cara.

~ / .ssh / config: (localmente)

SendEnv MYVAR

/ etc / ssh / sshd_config: (no extremo remoto)

AcceptEnv MYVAR

Agora, seja qual for o valor de $MYVAR localmente, ele também fica disponível na sessão remota.
Se você fizer login várias vezes, cada sessão terá sua própria cópia de $MYVAR , possivelmente com valores diferentes.

~/.ssh/environment destina-se a outros fins. Ele age como $ENV file ao executar comandos não shell remotamente.

    
por 16.01.2014 / 21:21
24

Há também um horrível e horrível hack.

Se o seu script estiver consumindo a variável no final remoto (ou seja, você pode nomear o que quiser), poderá abusar das variáveis de localidade. Qualquer variável do formulário LC_ * será passada na íntegra, sem necessidade de configuração alguma.

Por exemplo, temos uma série de servidores bastion em um dos meus clientes. Eu odeio ter que se conectar a ele, apenas para se conectar a outro servidor ... e outro servidor ... a cada vez. Eu tenho um script que se comporta exatamente como o SSH, exceto que é inteligente.

Basicamente, se LC_BOUNCE_HOSTS está definido, ele divide em espaços e remove o primeiro host. Em seguida, ele passa e executa o mesmo script. No nó de destino, essa lista está eventualmente vazia, portanto, ele executa o comando. Eu também tenho um modo de depuração (que é ótimo durante problemas de rede), que é definido por LC_BOUNCE_DEBUG. Como o ssh passa todas essas coisas para mim magicamente, não preciso fazer nada além de reconhecer o final da lista de hosts (o que faço com uma opção -).

Eu me sinto suja toda vez que uso isso, mas funciona em todos os lugares que tentei.

    
por 26.09.2012 / 22:27
24

Você pode passar valores com um comando semelhante ao seguinte:

ssh username@machine VAR=value cmd cmdargs

Você pode testar com:

ssh machine VAR=hello env

No tcsh, o seguinte parece funcionar:

ssh machine "setenv VAR <value>; printenv"
    
por 14.04.2011 / 17:26
1
bla="MyEnvSelection=dcop"
ssh user@host "export $bla && ./runProg"

Na bash eu testei com:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@host "export $bla && ./readEnv.sh"
    
por 09.02.2016 / 14:47