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ć.
- ~ / .Bash_profile jest pozyskiwany (tylko przez połączenia bash),
- ~ / .bashrc nigdy nie jest pozyskiwany,
- profil ~ /. nigdy nie jest pozyskiwany,
- środowisko ~ / .ssh / nigdy nie jest pozyskiwane,
- ~ / .ssh / rc jest pozyskiwane (przez bash i zdalnie oba), ale myślę, że jest wywoływane w podpowłoce, ponieważ zmienne znikają.
- ~ / .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
źródło
Odpowiedzi:
Zakładając, że
UsePAM yes
w/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/gitenv
możesz dodać ten wiersz do/etc/pam.d/sshd
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.
źródło
/etc/environment
jest to źródłopam_env.so
domyślnieUstawiam zmienną środowiskową dla moich połączeń SSH za pomocą
~/.ssh/environment
. Plik może zawierać zmienną w formieVAR=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:
Musisz ponownie załadować konfigurację serwera SSH. Na RHEL lub Suse Linux robisz (jako root)
(Prawdopodobnie zastąp sshd przez ssh, jeśli to nie działa)
Na Ubuntu (używając upstart) robisz
W każdym innym systemie Linux możesz spróbować (jako root)
(Zamień sshd na ssh lub openssh lub cokolwiek, co odpowiadałoby skryptowi inicjalizacji serwera SSH)
źródło
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 /
W ~ / connect.sh:
I w ~ / .env_profile:
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.
źródło
Jeśli używasz
bash
jako 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:
na początku. wszelkie zmiany, które chcesz wprowadzić nawet w przypadku nieinteraktywnych logowań, będą musiały przekroczyć takie oświadczenie.
.profile
jest bardziej ogólnym miejscem do umieszczenia takiej konfiguracji i jest szanowany przez większość powłok (w domyślnej konfiguracji Debiana to przede wszystkim~/.profile
wywołania~/.bashrc
). Może być konieczne bardziej ostrożne edytowanie,.profile
na wypadek, gdyby były interpretowane przez inne powłoki - tj. Staraj się unikać używaniabash
określonych rozszerzeń.Edytować
Jeśli masz
.bash_profile
edycję, która zamiast.profile
: bash użyje go na rzecz bardziej ogólnego pliku i możesz bezpiecznie użyć tam specyficznych rzeczy bash.źródło
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:
W takim przypadku sugeruję użycie bezwzględnej ścieżki do skryptu
źródło
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:
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.
źródło
ssh -Y user@remote git.sh gui
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 .
Aby również pchać i pobierać:
źródło
/ etc / profil będzie pozyskiwany przy każdym połączeniu z klientem ssh.
źródło