SSH - ustawianie wartości env vairables przy każdym połączeniu - host współdzielony chrzestny

16

Mój problem polega na tym, że muszę ustawić zmienne env (takie jak GIT_EXEC_PATH) na serwerze. Potrzebuję tych zmiennych przy każdym połączeniu (więc przez bash i za pomocą poleceń zdalnych). Udało mi się ustawić te zmienne przez bash z .bash_profile, ale mam problemy ze zdalnymi poleceniami. Odkryłem, że możliwe jest pisanie poleceń w ~ / .ssh / Author_keys przed właściwym kluczem rsa, ale nie chcę tam pisać zawsze, potrzebuję stałego rozwiązania ... Odkryłem, że ~ / .ssh Plik / rc jest wykonywany przy każdym logowaniu ssh, więc umieściłem tam moje deklaracje zmiennych env, ale to nie działało. Zmienne są ustawione w pliku rc, ale potem zniknęły. : S Może plik rc działa w podpowłoce: S Czy jest jakiś sposób na zdefiniowanie tych zmiennych w bash i zdalnych poleceniach bez powielania kodu?

Edytować:

Zredagowałem pytanie, ponieważ serwer jest współdzielonym hostem chrzestnym, więc ma unikalną konfigurację. Pliki / etc / ssh / sshd_config i pliki / etc / ssh / ssh_config są puste. W tych plikach znajdują się komentarze, jeśli jesteś ciekawy, mogę je tutaj skopiować.

  1. ~ / .Bash_profile jest pozyskiwany (tylko przez połączenia bash),
  2. ~ / .bashrc nigdy nie jest pozyskiwany,
  3. profil ~ /. nigdy nie jest pozyskiwany,
  4. środowisko ~ / .ssh / nigdy nie jest pozyskiwane,
  5. ~ / .ssh / rc jest pozyskiwane (przez bash i zdalnie oba), ale myślę, że jest wywoływane w podpowłoce, ponieważ zmienne znikają.
  6. ~ / .Ssh / autoryzowane_klucze są pozyskiwane za każdym razem, ale muszę pisać polecenia przed każdym klawiszem rsa (więc nie chcę się z tym konfigurować).

Streszczenie:

Mogę dobrze skonfigurować bash (z .bash_profile), ale nie mogę skonfigurować zdalnych wywołań. To jest problem. Szukam pliku, który pochodzi zarówno z poleceń bash, jak i poleceń zdalnych.

Na przykład:

Komenda git-upload-pack znajduje plik exe, ponieważ zmienna env GIT_EXEC_PATH jest ustawiona, ale ze zdalnym: „git clone uż[email protected]: myrepo local / myrepo” serwer nie znajduje tego polecenia, ponieważ GIT_EXEC_PATH nie jest ustawiony.

Edycja2:

Zgodnie z tym i moje dzienniki printenv: ~ / .ssh / rc działa w normalnej powłoce, a nie w podpowłoce, więc zagadką jest, dlaczego zmienne env nie przyklejają się ...

Utworzyłem plik wykonywalny: ~ / logenv :

echo "" >> mylog.txt
date >> mylog.txt
printenv >> mylog.txt
echo "" >> mylog.txt

I umieść to w ~ / .ssh / rc :

export AAA=teszt
source ~/logenv

Po logowaniu bash i logowaniu do źródła wynik był:

Tue May 15 04:21:37 MST 2012
TERM=cygwin
SHELL=/bin/bash
SSH_CLIENT=censored
SSH_TTY=/dev/pts/2
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:21:41 MST 2012
HOSTNAME=censored
TERM=cygwin
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=censored

Zdalny „ssh [email protected] 'exec ~ / logenv'” wynik był:

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
PATH=/usr/local/bin:/bin:/usr/bin
MAIL=/var/mail/myuser
PWD=/home/content/65/7962465
HOME=/var/chroot/home/content/65/7962465

Więc plik rc jest pozyskiwany, ale potem zmienne rozpraszają ...: S

inf3rno
źródło
Niektóre opcje w tym wątku - stackoverflow.com/questions/216202/…
EightBitTony
„W przeciwieństwie do / etc / sshrc, który jest zawsze przetwarzany przez powłokę Bourne'a (/ bin / sh), plik rc jest przetwarzany przez normalną powłokę logowania na koncie.” - to dziwne, ponieważ wygląda na to, że nie pochodzi z normalnej powłoki: S
inf3rno

Odpowiedzi:

12

Zakładając, że UsePAM yesw /etc/ssh/sshd_config, i zakładając, że chcemy te zmienne środowiskowe ustawione dla każdego użytkownika, można mieć zestaw zmiennych pam środowiskowe dla Ciebie. Jeśli masz zdefiniowane zmienne środowiskowe, /etc/gitenvmożesz dodać ten wiersz do/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

Lub poprzez obcięcie tego pliku możesz odkryć, że jest już używany plik pam_env.so i już istnieje plik, do którego możesz dodawać różne elementy. Bądź ostrożny i upewnij się, że dokładnie przetestowałeś zmiany przed zakończeniem sesji ssh, ponieważ gdy zadzierasz z PAM, możesz całkowicie przerwać możliwość logowania się na serwerze, jeśli nie będziesz ostrożny.

gulasz
źródło
Mam godaddy wspólne konto hosta, więc mogę modyfikować tylko katalog ~. (Ma system centos op.)
inf3rno
@ inf3rno to nie zaszkodzi upvote dobrej odpowiedzi :) ponieważ i tak rozwiązanie, które rozwiąże twój problem, może być oznaczone innym sposobem.
Huygens
Ok. Będę, ale nie jestem jedynym, który może głosować ... :-)
inf3rno
Wydaje się, że na Ubuntu /etc/environmentjest to źródło pam_env.sodomyślnie
rcoup
4

Ustawiam zmienną środowiskową dla moich połączeń SSH za pomocą ~/.ssh/environment. Plik może zawierać zmienną w formie VAR=value, nie ma potrzeby jawnego ich eksportowania.

Jednak ten plik konfiguracyjny użytkownika jest domyślnie ignorowany przez proces serwera SSH, chyba że opcja PermitUserEnvironment ma wartość Tak. Dlatego musisz koniecznie edytować plik / etc / sshd_config na serwerze SSH, aby dodać lub zaktualizować ten parametr:

PermitUserEnvironment yes

Musisz ponownie załadować konfigurację serwera SSH. Na RHEL lub Suse Linux robisz (jako root)

/sbin/service sshd reload

(Prawdopodobnie zastąp sshd przez ssh, jeśli to nie działa)

Na Ubuntu (używając upstart) robisz

sudo reload ssh

W każdym innym systemie Linux możesz spróbować (jako root)

/etc/init.d/sshd reload

(Zamień sshd na ssh lub openssh lub cokolwiek, co odpowiadałoby skryptowi inicjalizacji serwera SSH)

Huygens
źródło
Dzięki, ale nie mogę pisać w katalogu / etc, środowisko ~ / .ssh / nie jest pozyskiwane.
inf3rno
2

Nie mam już wspólnego hosta chrzestnego, więc nie mogę sprawdzić, czy proponowane rozwiązania są prawidłowe. Pozostanie zaakceptowana odpowiedź, ponieważ zadziałała ona, kiedy zadałem pytanie. Inne odpowiedzi również mogą działać. Pozwalam społeczności decydować o tym z pozytywnymi opiniami.

Ok. Rozwiązaniem jest to, że nie ma rozwiązania na wspólnym hoście chrzestnym. Próbowałem wszystkiego, ale nic nie działa, więc zdecydowałem, że pozostanę przy klawiszach ~ / .ssh /

command="~/connect.sh" ssh-rsa AAAAB3NzaC...

W ~ / connect.sh:

#!/bin/bash
if [ -f "${HOME}/.env_profile" ]; then
        source ~/.env_profile
fi;

if [ "x${SSH_ORIGINAL_COMMAND}x" == "xx" ]; then
        $SHELL --login
else
        eval "${SSH_ORIGINAL_COMMAND}"
fi;

I w ~ / .env_profile:

export PATH=$PATH:$HOME/bin:$HOME/git/libexec/git-core
export LD_LIBRARY_PATH=$HOME/git/lib
export GIT_EXEC_PATH=~/git/libexec/git-core
export GIT_TEMPLATE_DIR=~/git/share/git-core/templates

Więc muszę skopiować polecenie = "..." do każdego klucza rsa w uprawnionych kluczach. To jest powielanie kodu, ale nie sądzę, że istnieje inne rozwiązanie na współdzielonych hostach chrzestnych.

inf3rno
źródło
1

Jeśli używasz bashjako powłoki, spróbuj dodać ustawienia środowiska do .bashrc.

Najpierw sprawdź, czy to się uruchamia podczas logowania, ale może nie być, ponieważ standardowe pliki często mają coś takiego:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

na początku. wszelkie zmiany, które chcesz wprowadzić nawet w przypadku nieinteraktywnych logowań, będą musiały przekroczyć takie oświadczenie.

.profilejest bardziej ogólnym miejscem do umieszczenia takiej konfiguracji i jest szanowany przez większość powłok (w domyślnej konfiguracji Debiana to przede wszystkim ~/.profilewywołania ~/.bashrc). Może być konieczne bardziej ostrożne edytowanie, .profilena wypadek, gdyby były interpretowane przez inne powłoki - tj. Staraj się unikać używania bashokreślonych rozszerzeń.

Edytować

Jeśli masz .bash_profileedycję, która zamiast .profile: bash użyje go na rzecz bardziej ogólnego pliku i możesz bezpiecznie użyć tam specyficznych rzeczy bash.

David Spillett
źródło
Przeczytaj sekcję „Edycja”, proszę. (.profile nie działa)
inf3rno
1

Możesz użyć polecenia dla wszystkich użytkowników / klucza bez dodawania części polecenia w uprawnionych kluczach, dodając ten wiersz do pliku sshd_config:

ForceCommand ~/connect.sh

W takim przypadku sugeruję użycie bezwzględnej ścieżki do skryptu

GARCIN David
źródło
0

Proponuję ci inne podejście.

Plik jest konfigurowany z deklaracją zmiennej środowiskowej, a następnie jest tworzony za każdym razem, gdy wywołuje się zdalne polecenie.

Przykład: umieścisz niezbędne zmienne w ~ / .my_var.rc, a następnie dla każdej zdalnej komendy, którą wykonasz ssh user@remote bash -c "source ~/.my_var.rc; <your command>"

Jeśli Ci to odpowiada, możesz udoskonalić tę koncepcję i napisać ją dla wygody. Jeśli potrzebujesz go tylko do poleceń git, stworzyłbym skrypty git.sh, które to zrobiłyby:

#!/bin/bash

source ~/.my_var.rc

git $@

Zakładając, że ten skrypt będzie w twoim katalogu domowym, nazwałbyś go: ssh user@remote git.sh pull origin master

Uwaga: to prosty punkt wyjścia. Na przykład nie obsługuje parametrów ze spacjami.

Huygens
źródło
Mogę to zrobić, ale ta konfiguracja nie jest dla mnie sama i powinna działać z git gui, w którym polecenia są generowane automatycznie ...
inf3rno
Czy łączysz się ze zdalnym ssh za pomocą tego samego użytkownika? Jeśli tak, to plik ~ / .my_var.rc będzie specyficzny dla użytkownika, a git.sh wspólny dla wszystkich. Jeśli nie, możesz dodać dodatkowy parametr do git.sh, który może pomóc ci rozróżnić, który plik .rc ma zostać pobrany (lub używając stałego adresu IP, możesz użyć informacji env SSH_CLIENT, aby odróżnić użytkowników). Polecenie powinno działać z git gui, zadzwońssh -Y user@remote git.sh gui
Huygens
Potrzebuję tych samych ustawień env dla każdego użytkownika. Nie dodam dodatkowej części do poleceń, to absurdalne ...
inf3rno
Jeśli więc ustawienia są takie same dla wszystkich użytkowników, odpowiedź jest kompletna i możesz zignorować mój poprzedni komentarz. Prawdopodobnie będziesz musiał umieścić pliki .rc i .sh w katalogu, który jest wspólny dla wszystkich / dostępny dla wszystkich użytkowników.
Huygens
@ inf3rno, jeśli chcesz uzyskać więcej odpowiedzi, powinieneś już podziękować tym, którzy zaproponowali dobre odpowiedzi, nawet jeśli nie dotyczą twojej sprawy, ponieważ w pierwotnym pytaniu brakowało informacji. Albo ludzie nie będą próbować.
Huygens
0

To nie odpowiada na ogólne pytanie dotyczące PATHS, ale pozwala na użycie repozytorium git na zdalnym serwerze, który nie ma git na swojej ścieżce i do którego nie masz dostępu do roota. To rozwiązanie pochodzi z tej strony .

git clone -u relative/path/to/bin/git-upload-pack [email protected]:relative/path/to/remote_repository.git

Aby również pchać i pobierać:

git config remote.origin.receivepack relative/path/to/bin/git-receive-pack
git config remote.origin.uploadpack relative/path/to/bin/git-upload-pack
Ben
źródło
0

/ etc / profil będzie pozyskiwany przy każdym połączeniu z klientem ssh.

Jason416
źródło
Tylko dla powłok logowania.
RalfFriedl