it-swarm-eu.dev

Come posso passare una variabile d'ambiente attraverso un comando ssh?

Come posso passare un valore in un comando ssh, in modo tale che l'ambiente avviato sulla macchina host inizi con una determinata variabile d'ambiente impostata su mia scelta?

EDIT: L'obiettivo è passare il desktop corrente di kde (da dcop kwin KWinInterface currentDesktop) alla nuova shell creata in modo che possa passare indietro un percorso nfs al mio JEdit istanza sul server originale che è unica per ogni desktop KDE. (Utilizzando un meccanismo come emacsserver / emacsclient )

Il motivo per cui le istanze di ssh multiple possono essere in volo contemporaneamente è perché quando sto configurando il mio ambiente, sto aprendo un sacco di diverse istanze di ssh su macchine diverse.

38
Ross Rogers

Il file ~/.ssh/environment può essere utilizzato per impostare le variabili che si desidera rendere disponibili per i comandi remoti. Dovrai abilitare PermitUserEnvironment nella configurazione sshd.

Le variabili impostate in questo modo vengono esportate nei processi figli, quindi puoi:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv [email protected]:~/.ssh/environment
ssh [email protected] myscript

e myscript saprà che Foo è Bar e Joe ha 37 anni.

15
John T

L'opzione SendEnv è il tuo ragazzo.

~/.ssh/config: (localmente)

SendEnv MYVAR

/etc/ssh/sshd_config: (sul lato remoto)

AcceptEnv MYVAR

Ora, qualunque sia il valore di $MYVAR localmente, diventa disponibile anche nella sessione remota.
Se accedi più volte, ogni sessione avrà una propria copia di $MYVAR, con valori eventualmente diversi.

~/.ssh/environment è pensato per altri scopi. Funziona come un file $ENV quando si esegue comandi non-Shell in remoto.

50
user15617

C'è anche un orribile, orribile hack.

Se il tuo script sta consumando la variabile sul lato remoto (ad esempio puoi chiamarlo come vuoi), puoi abusare delle variabili locali. Qualsiasi variabile del modulo LC_ * sarà trasmessa letteralmente, senza alcun requisito per la configurazione di sorta.

Ad esempio, abbiamo una serie di server bastion in uno dei miei clienti. Odio dover connettersi ad esso, solo per connettersi ad un altro server ... e ad un altro server ... ogni volta. Ho uno script che si comporta proprio come SSH, tranne per il fatto che è intelligente.

Fondamentalmente, se LC_BOUNCE_HOSTS è impostato, lo divide in spazi e rimuove il primo Host. Quindi rimbalza e esegue lo stesso script. Nel nodo di destinazione, questo elenco è vuoto, quindi esegue il comando. Ho anche una modalità di debug (che è grande durante i problemi di rete), che è impostata da LC_BOUNCE_DEBUG. Dal momento che ssh passa tutti questi per me magicamente, non devo fare altro che riconoscere la fine dell'elenco Host (cosa che faccio con un'opzione -).

Mi sento sporco ogni volta che lo uso, ma funziona ovunque io abbia provato.

28
Jayson

È possibile passare valori con un comando simile al seguente:

ssh [email protected] VAR=value cmd cmdargs

Puoi testare con:

ssh machine VAR=hello env

Su tcsh il seguente sembra funzionare:

ssh machine "setenv VAR <value>; printenv"
27
Waltor
bla="MyEnvSelection=dcop"
ssh [email protected] "export $bla && ./runProg"

Su bash ho provato con:

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

$ scp readEnv.sh [email protected]:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh [email protected] "export $bla && ./readEnv.sh"
1
Zeh