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

Quando ssh'ing, come posso impostare una variabile d'ambiente sul server che cambia da una sessione all'altra?

Quando faccio ssh in un server, come posso passare una variabile d'ambiente dal client al server? Questa variabile d'ambiente cambia tra diverse invocazioni di ssh quindi non voglio sovrascrivere $HOME/.ssh2/environment ogni volta che faccio una chiamata ssh. Come posso farlo?

Risposte (8)

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

Naturalmente, potete impostare la variabile d'ambiente all'interno del comando, tuttavia dovrete stare attenti al quoting: ricordate che la vostra shell analizzerà la vostra linea di comando locale, e poi la shell remota farà un tentativo sulla stringa che riceve.

Se volete che una variabile abbia lo stesso valore sul server che ha sul client, provate l'opzione SendEnv:

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

Questo però richiede il supporto del server. Con OpenSSH, il nome della variabile deve essere autorizzato in /etc/sshd_config.

Se il server permette solo certi nomi specifici di variabili, puoi aggirare la cosa; per esempio una configurazione comune permette LC_* attraverso, e puoi fare come segue:

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

Se anche LC_* non è un'opzione, puoi passare informazioni nella variabile d'ambiente TERM, che viene sempre copiata (potrebbe esserci un limite di lunghezza però). Dovrete comunque assicurarvi che la shell remota non limiti la variabile TERM per designare un tipo di terminale noto. Passate l'opzione -t a ssh se non state avviando una shell interattiva remota.

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

Un'altra possibilità è quella di definire la variabile direttamente nel comando:

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

Così, se si passa una variabile locale:

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

Attenzione però ai problemi di quoting: il valore della variabile sarà interpolato direttamente nello snippet di shell eseguito sul lato remoto. L'ultimo esempio sopra presuppone che $LOCALVAR non contenga alcun apice singolo (').

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

Se potete amministrare l'host di destinazione, potete configurare sshd per permettere il passaggio delle vostre variabili d'ambiente locali all'host di destinazione.

Dalla pagina man di 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.

la configurazione di sshd vive tipicamente a /etc/ssh/sshd_config

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

Quindi, sul tuo client, hai qualche variabile d'ambiente, e vuoi che sia disponibile per il comando remoto? Non credo ci sia un modo per far sì che ssh la passi magicamente, ma probabilmente potete fare qualcosa del genere. Invece di usare, diciamo:

ssh remote.host my_command

potete fare così:

ssh remote.host env ENV_VAR=$ENV_VAR my_command
4
4
4
2019-06-12 10:45:04 +0000

Sul tuo client locale, nel tuo ~/.ssh/config puoi aggiungere SetEnv, per esempio

Host myhost
  SetEnv FOO=bar

Nota: Controlla man ssh_config.

Poi sul server, assicurati di permettere al client di passare certe variabili d'ambiente nel tuo file di configurazione /etc/ssh/sshd_config:

AcceptEnv LANG LC_* FOO BAR*

Nota: Controlla man sshd_config.

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

La risposta di @emptyset (che non ha funzionato per me) mi ha portato a questa risposta:

Puoi aggiungere questo comando al tuo file ~/.ssh/authorized_keys:

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

export VARIABLE=<something> usciva immediatamente, e la connessione SSH veniva chiusa (bloccandomi fuori dal server), mentre /usr/bin/env ... $SHELL eseguirà la tua shell di default con un ambiente modificato.

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

Potreste provare a invocare un comando personalizzato, assumendo che abbiate impostato il login ssh senza password. Sul server, modificate la vostra voce ~/.ssh/authorized\keys che corrisponde alla chiave del vostro client:

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

Guardate questo link nella sezione Forced Command per qualche dettaglio in più.

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

Stavo facendo una build personalizzata di OpenSSH per un dispositivo con un cramfs nella home directory e /etc (Cram FS è di sola lettura) quindi ~/.ssh/environment non avrebbe funzionato senza ricostruire l'intero FS e questi erano dispositivi distribuiti sul campo (sistemi embedded da cui l'uso di CRAMFS). Puoi specificare in sshd\config la posizione del file authroized_keys ma per qualche ragione l'environment= funziona solo per le variabili d'ambiente in ~/.ssh/authroized\keys. Modificare il /etc/profile non era un'opzione e ho dovuto caricare ssh in una directory non standard. In session.c dopo il child\set_env(… “MAIL”…) aggiungi semplicemente le variabili d'ambiente di cui hai bisogno (questo è un hack, lo so…) ma nel caso in cui qualcuno abbia bisogno di alcuni env hardcoded per una sessione, se stai compilando da sorgente puoi fare così. TGI-FLOSS

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

solo un semplice comando:

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