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

W jaki sposób mogę ustawić zmienną środowiskową na serwerze, która będzie się zmieniać z sesji na sesję?

Kiedy ssh do serwera, jak mogę przekazać zmienną środowiskową z klienta do serwera? Ta zmienna środowiskowa zmienia się pomiędzy różnymi wywołaniami ssh, więc nie chcę nadpisywać $HOME/.ssh2/environment za każdym razem, gdy wykonuję wywołanie ssh. Jak mogę to zrobić?

Odpowiedzi (8)

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

Oczywiście, możesz ustawić zmienną środowiskową wewnątrz polecenia, jednakże będziesz musiał uważać na cytowanie: pamiętaj, że twoja powłoka będzie parsować twój lokalny wiersz poleceń, a następnie zdalna powłoka będzie się posługiwać łańcuchem, który otrzyma.

Jeśli chcesz, by zmienna miała taką samą wartość na serwerze jak na kliencie, spróbuj opcji SendEnv:

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

Wymaga to jednak wsparcia ze strony serwera. W OpenSSH, nazwa zmiennej musi być autoryzowana w /etc/sshd_config.

Jeśli serwer zezwala tylko na pewne określone nazwy zmiennych, możesz to obejść; na przykład wspólna konfiguracja pozwala na LC_* i możesz zrobić co następuje:

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

Jeśli nawet LC_* nie jest opcją, możesz przekazać informacje w zmiennej środowiskowej TERM, która jest zawsze kopiowana (może jednak istnieć limit długości). Nadal będziesz musiał się upewnić, że zdalna powłoka nie ogranicza zmiennej TERM do oznaczania znanego typu terminala. Przekaż opcję -t do ssh jeśli nie uruchamiasz zdalnej powłoki interaktywnej.

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

Inną możliwością jest zdefiniowanie zmiennej bezpośrednio w poleceniu:

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

W ten sposób, jeśli przekazujemy zmienną lokalną:

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

Należy jednak uważać na problemy z cytowaniem: wartość zmiennej będzie interpolowana bezpośrednio do snippetu powłoki wykonywanego po stronie zdalnej. Ostatni przykład powyżej zakłada, że $LOCALVAR nie zawiera żadnych pojedynczych cudzysłowów (').

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

Jeśli potrafisz administrować hostem docelowym, możesz skonfigurować sshd tak, aby pozwalał na przekazywanie zmiennych środowiskowych do hosta docelowego.

Ze strony 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.

Konfiguracja sshd zazwyczaj mieszka pod adresem /etc/ssh/sshd_config.

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

Więc na swoim kliencie masz jakąś zmienną środowiskową i chcesz, aby była ona dostępna dla zdalnego polecenia? Nie sądzę, że istnieje sposób, aby ssh magicznie przekazał ją dalej, ale prawdopodobnie możesz zrobić coś takiego. Zamiast używać, powiedzmy:

ssh remote.host my_command

możesz zrobić tak:

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

Na lokalnym kliencie, w swoim ~/.ssh/config możesz dodać SetEnv, np.

Host myhost
  SetEnv FOO=bar

Uwaga: Sprawdź man ssh_config.

Następnie na serwerze, upewnij się, że zezwalasz klientowi na przekazywanie pewnych zmiennych środowiskowych w pliku konfiguracyjnym /etc/ssh/sshd_config:

AcceptEnv LANG LC_* FOO BAR*

Uwaga: Sprawdź man sshd_config.

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

Odpowiedź @emptyset (która nie zadziałała dla mnie) doprowadziła mnie do tej odpowiedzi:

Możesz dodać to polecenie do swojego pliku ~/.ssh/authorized_keys:

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

export VARIABLE=<something> natychmiast wychodził, a połączenie SSH zostało zamknięte (blokując mnie z serwera), podczas gdy /usr/bin/env ... $SHELL uruchomi twoją domyślną powłokę ze zmodyfikowanym środowiskiem.

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

Możesz spróbować wywołać niestandardowe polecenie, zakładając, że masz ustawione logowanie ssh bez hasła. Na serwerze, edytuj swój wpis ~/.ssh/authorized_keys, który odpowiada kluczowi od klienta:

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

Zajrzyj do ten link w sekcji Forced Command po trochę więcej szczegółów.

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

Tworzyłem niestandardowy build OpenSSH dla urządzenia z cramfs w katalogu domowym i /etc (Cram FS jest tylko do odczytu), więc ~/.ssh/environment nie działałoby bez przebudowy całego FS, a były to urządzenia wdrożone w terenie (Embedded Systems stąd użycie CRAMFS). Możesz określić w sshd_config lokalizację pliku authroized_keys, ale z jakiegoś powodu environment= działa tylko dla zmiennych środowiskowych w ~/.ssh/authroized_keys. Edytowanie pliku /etc/profile nie było opcją i musiałem załadować ssh do niestandardowego katalogu. W session.c po child\u00set\u00env(… “MAIL”…) po prostu dodaj zmienne enviroment, których potrzebujesz (To jest hack, wiem…), ale na wypadek gdyby ktoś potrzebował jakiegoś hardcoded envs dla sesji, jeśli kompilujesz ze źródła, możesz to zrobić. TGI-FLOSS

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

wystarczy jedna prosta komenda :

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