Kiedy ssh
przechodzę na serwer, jak mogę przekazać zmienną środowiskową z klienta na serwer? Ta zmienna środowiskowa zmienia się między różnymi wywołaniami ssh, więc nie chcę nadpisywać za $HOME/.ssh2/environment
każdym razem, gdy wykonuję wywołanie ssh. Jak mogę to zrobić?
ssh
environment-variables
Ross Rogers
źródło
źródło
ssh
stronie podręcznika nie widzę innego sposobu, niż ręczne ustawienie zmiennej po zalogowaniu się na serwerze, chyba że zmodyfikujesz środowisko ~ / .ssh2 /.Odpowiedzi:
Oczywiście możesz ustawić zmienną środowiskową wewnątrz polecenia, jednak musisz uważać na cytowanie: pamiętaj, że twoja powłoka przeanalizuje lokalny wiersz poleceń, a wtedy zdalna powłoka będzie miała ciąg otrzymuje.
Jeśli chcesz, aby zmienna otrzymywała tę samą wartość na serwerze, co na kliencie, wypróbuj
SendEnv
opcję:Wymaga to jednak wsparcia ze strony serwera. W OpenSSH nazwa zmiennej musi być autoryzowana w
/etc/sshd_config
.Jeśli serwer zezwala tylko na określone nazwy zmiennych, możesz obejść to; na przykład pozwala na to wspólna konfiguracja
LC_*
i można wykonać następujące czynności:Jeśli nawet
LC_*
nie jest opcją, możesz przekazać informacje doTERM
zmiennej środowiskowej, która jest zawsze kopiowana (może istnieć jednak limit długości). Nadal będziesz musiał upewnić się, że zdalna powłoka nie ograniczaTERM
zmiennej do wyznaczania znanego typu terminala. Przekaż-t
opcję ssh, jeśli nie uruchamiasz zdalnej interaktywnej powłoki.Inną możliwością jest zdefiniowanie zmiennej bezpośrednio w poleceniu:
Zatem jeśli przekazujesz zmienną lokalną:
Uważaj jednak na kwestie cytowania: wartość zmiennej zostanie interpolowana bezpośrednio do fragmentu powłoki wykonanego po stronie zdalnej. Ostatni przykład powyżej zakłada, że
$LOCALVAR
nie zawiera żadnych pojedynczych cudzysłowów ('
).źródło
AcceptEnv
dyrektywamisshd_config
zgodnie z życzeniem administratora. AleTERM
jest traktowany specjalnie, o ile wiem, nie ma możliwości filtrowania go po stronie serwera (jest ustawiony w środowisku powłoki niezależnie od jakichkolwiek ustawień konfiguracyjnych). Czy na pewno nie ma skryptu profilu zastępującego go (jak/etc/profile
lub~/.profile
lub~/.bashrc
)?TERM
jest przesyłany tylko wtedy, gdy klient poprosi serwer o przydzielenie tty. Jeśli po drugiej stronie nie ma terminala, nadawanie byłoby bezużyteczneTERM
. Jeśli określisz polecenie, jeśli chcesz mieć terminal po stronie zdalnej, potrzebujesz-t
opcji wiersza polecenia (lubRequestTTY
in~/.ssh/config
).Jeśli możesz administrować hostem docelowym, możesz skonfigurować sshd, aby zezwalał na przekazywanie lokalnych zmiennych środowiskowych do hosta docelowego.
Ze strony podręcznika sshd_config:
Konfiguracja sshd zwykle mieszka w
/etc/ssh/sshd_config
źródło
Na kliencie masz więc zmienną środowiskową i chcesz, aby była dostępna dla polecenia zdalnego? Nie sądzę, że istnieje sposób, aby ssh magicznie to przekazał, ale prawdopodobnie możesz zrobić coś takiego. Zamiast używać powiedz:
Możesz to zrobić:
źródło
Odpowiedź @ emptyset (która nie działała dla mnie) doprowadziła mnie do tej odpowiedzi:
Możesz dodać to polecenie do swojego
~/.ssh/authorized_keys
pliku:export VARIABLE=<something>
natychmiast wychodził, a połączenie SSH zostało zamknięte (blokując mnie z serwera), natomiast/usr/bin/env ... $SHELL
uruchomi domyślną powłokę w zmodyfikowanym środowisku.źródło
$SHELL
rzeczywistą powłoką? Sprawdź także, czy / usr / bin / env istnieje na serwerze. Jednak rozwiązanie nie jest idealne: zauważyłem, że zawiesił się, gdy chciałem użyćscp
polecenia lub polecenia wbudowanego.PermitUserEnvironment yes
i uruchomionoenvironment="..."
zamiastcommand="..."
.Na swoim lokalnym kliencie
~/.ssh/config
możesz dodaćSetEnv
npUwaga: Sprawdź
man ssh_config
.Następnie na serwerze upewnij się, że klient może przekazać określone zmienne środowiskowe w
/etc/ssh/sshd_config
pliku konfiguracyjnym:Uwaga: Sprawdź
man sshd_config
.źródło
Możesz spróbować wywołać niestandardowe polecenie, zakładając, że masz konfigurację logowania ssh bez hasła. Na serwerze edytuj wpis ~ / .ssh / Author_keys, który odpowiada kluczowi od twojego klienta:
Spójrz na ten link w sekcji Wymuszone polecenie, aby uzyskać trochę więcej szczegółów.
źródło
Tworzyłem niestandardową kompilację 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 i zostały one wdrożone w terenie urządzenia (systemy osadzone Stąd użycie CRAMFS). Możesz określić w pliku sshd_config lokalizację pliku authroized_keys, ale z jakiegoś powodu środowisko = działa tylko dla zmiennych środowiskowych w ~ / .ssh / authroized_keys. Edycja profilu / etc / nie była opcją i musiałem załadować ssh do niestandardowego katalogu. W session.c po child_set_env (... „MAIL” ...) po prostu dodaj potrzebne zmienne środowiskowe (wiem, że to hack ...), ale jeśli tylko potrzebujesz kogoś, kto potrzebuje trochę zakodowanych envów na sesję, jeśli jesteś kompilując ze źródła możesz to zrobić. TGI-FLOSS
źródło
tylko jedno proste polecenie:
źródło