jak wyłączyć zmienne SendEnv ustawione w ssh_config z ~ / .ssh / config

30

Nigdzie nie mogłem tego znaleźć, więc zastanawiam się, czy tylko ja mam do czynienia z takim problemem.

Domyślnie ssh w Red Hat i Debian ma przynajmniej ssh_config z opcją SendEnv przekazującą zmienne LC * i LANG w sesji zdalnej. Jeśli ktoś nie jest rootem, aby zmienić / etc / ssh / ssh_config, jak może wyłączyć to zachowanie? Opcja SendEnv wydaje się kumulować i nie widzę żadnego sposobu, aby ją zresetować.

Aby uniknąć pytania, muszę unikać przekazywania ustawień regionalnych do testowania maszyn, aby uniknąć skutków ubocznych skryptów i programów, które domyślnie używają ustawień regionalnych.

akostadinov
źródło
To nie jest odpowiedź na twoje pytanie, ale czy możesz rozwiązać problem, wywołując skrypty i programy na twoich maszynach testowych za pomocą envlub za pomocą skryptu opakowania?
Scott,
2
tak, obejścia są możliwe, ale niewygodne
akostadinov 10.10 o

Odpowiedzi:

18

Nie jesteś jedyny . Jak udokumentowano ssh_config(5), nie można rozbroić SendEnv, ponieważ

Wiele zmiennych środowiskowych może być [...] rozłożonych na wiele dyrektyw SendEnv.

Jeśli masz root na testowych komputerach, możesz zmienić, AcceptEnvaby nie akceptować zmiennych wysyłanych przez klienta.

Ansgar Wiechers
źródło
4
bzdury, widzę, że tylko -F w wierszu poleceń może pomóc, ale jest zbyt niewygodne, aby naprawdę go używać. Zobacz bugzilla.mindrot.org/show_bug.cgi?id=1285
akostadinov
5

Nie można tego zrobić, ~/.ssh/configponieważ SendEnvnie można go zastąpić.

Używanie aliasów nie działa w skryptach wywołujących ssh.

Jedną z możliwości jest eksport funkcji. Np. W ~/.bashrc:

function ssh() {
    LANG="en_US.UTF-8" \
    LC_ADDRESS="$LANG" \
    LC_IDENTIFICATION="$LANG" \
    LC_MEASUREMENT="$LANG" \
    LC_MONETARY="$LANG" \
    LC_NAME="$LANG" \
    LC_NUMERIC="$LANG" \
    LC_PAPER="$LANG" \
    LC_TELEPHONE="$LANG" \
    LC_TIME="$LANG" \
    LC_ALL="$LANG" \
    /usr/bin/ssh $@
}
export -f ssh
Fernando Correia
źródło
1

Istnieje opcja SetEnv, którą można wymusić LANGdo określonej wartości przed wysłaniem.

Mówi to również strona man

Możliwe jest wyczyszczenie wcześniej ustawionych nazw zmiennych SendEnv przez poprzedzenie wzorców znakiem -.

ale nie udało mi się sprawić, żeby to działało.

burunduk3
źródło
Zobacz bugzilla.mindrot.org/show_bug.cgi?id=1285 , prawdopodobnie to wyjaśni, dlaczego to -podejście nie zadziałało. Dobra sugestia, aby jednak zakodować zdalnie LANG i inne zmienne w konfiguracji ssh. Sprawia, że ​​rzeczy są bardziej przewidywalne. Być może SetEnvjest to nowsza dyrektywa, ponieważ nikt inny jej nie zasugerował. SetEnv LANG=en_US.UTF-8
akostadinov
0

Jeśli używasz bash, możesz ustawić alias ssh = 'LANG = polecenie ssh', aby wyłączyć przekazywanie LANG do innych serwerów.

Tharrrk
źródło
0

Możesz użyć, su - yourusergdy jesteś zalogowany przez ssh. Spowoduje to ponowne zainicjowanie środowiska dla użytkownika.

W rzeczywistości inicjujesz nową sesję w nowym środowisku.

Lambert
źródło
Pytanie polega na tym, aby środowisko działało automatycznie. A btw su nie zawsze jest instalowane. I musisz wpisać hasło za pomocą su. Nieprzydatne. Są łatwiejsze obejścia.
akostadinov
0

Według man ssh:

 -F configfile
         Specifies an alternative per-user configuration file.  If a con-
         figuration file is given on the command line, the system-wide
         configuration file (/etc/ssh/ssh_config) will be ignored.  The
         default for the per-user configuration file is ~/.ssh/config.

Możesz więc ssh bez przestrzegania/etc/ssh/ssh_config , jawnie określając (domyślny) plik konfiguracyjny w wierszu poleceń ( ~/.ssh/configjest OK, aby być pustym):

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host

Możesz utworzyć dla niego alias w ~/.bashrc:

alias ssh="ssh -F ~/.ssh/config"

Uruchom ponownie powłokę bash, a następnie możesz po prostu ssh w następujący sposób:

$ ssh your_user@your_host
Rockallite
źródło
Zobacz mój komentarz powyżej. if one supplies on command line -F, then the system wide config is ignored according to man pagefrom bugzilla.mindrot.org/show_bug.cgi?id=1285 ; jest to opcja, ale nie jest to pożądana funkcja.
akostadinov