~ / .profile nie jest ładowany podczas korzystania z SSH (Ubuntu)

22

Edytowane w celu odzwierciedlenia problemu, który naprawdę chciałem rozwiązać:

Muszę skonfigurować moje środowisko rubinowe, aby móc wdrożyć za pośrednictwem Capistrano.

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

Umieszczam je w ~ deploy / .profile, ale kiedy ssh do mnie, nie są uruchamiane. Pomysły?

Używam Ubuntu 12.04.


Pierwotne pytanie brzmiało:

Kiedy ssh na inne konto na localhost, nie ładuje mojego .profile. Jak zmusić ssh do załadowania? Używam Ubuntu 12.04.

Charles R.
źródło

Odpowiedzi:

15

Możesz jawnie określić, że chcesz uruchomić interaktywną powłokę logowania:

 ssh user@host bash --login -i 

„Rola” o ~/.profile(. Lub ~ / bash_profile) i .bashrcdla ssh jakieś inne pliki (patrz man sshszczegóły):

~ / .ssh / environment

Zawiera dodatkowe definicje zmiennych środowiskowych; patrz ŚRODOWISKO powyżej.

~ / .ssh / rc

Polecenia w tym pliku są wykonywane przez ssh, gdy użytkownik loguje się, tuż przed uruchomieniem powłoki (lub polecenia) użytkownika. Więcej informacji znajduje się na stronie podręcznika sshd (8).


źródło
„Możesz” często nie jest prawdą, ponieważ ssh jest uruchamiany przez inne narzędzie (ciągłe dostarczanie) i polecenia nie można łatwo zmienić.
Jan Hudec
6

.profilejest ładowany tylko dla powłok logowania, którymi nie jest sesja ssh (domyślnie). Jeśli chcesz, aby coś uruchomiło się przy starcie dla wszystkich interaktywnych powłok, włóż to .bashrczamiast tego ( .zshrclub cokolwiek, czego używa twoja powłoka).

Ponadto, jeśli chcesz po prostu zalogować się na inne konto na komputerze lokalnym, ssh prawdopodobnie przesadza. Możesz suzamiast tego użyć lub czegoś.

qmega
źródło
3
Wygląda na .bashrcto, że nie jest również załadowany.
kenorb
To jest niepoprawne. Jest to powłoka logowania. Ze strony podręcznika: „Jeśli podano polecenie, jest ono wykonywane na zdalnym hoście zamiast powłoki logowania.”
mkj
~ / .zshenv działa dla mnie. unix.stackexchange.com/questions/4921/sh-startup-files-over-ssh
user91155
Kiedy ssh otrzyma polecenie uruchomienia, domyślnie nie przydziela tty, a wtedy powłoka również nie jest „interaktywna”.
Jan Hudec
4

Używanie bash powinno skutkować czytaniem ~/.bashrc. Następujące mogą pomóc w ksh i sh (bash w trybie sh) lub gdy twój ~/.bashrcnie jest wykonywany podczas logowania.

Sshd ~/.ssh/environmentsprawdza (uprawnienia sshd_config (5)) i ~/.ssh/sshrclub ~/.ssh/rc. Daje to możliwość konfiguracji ENV=~/.profilelub BASH_ENV=~/.profileiSSH_LOGIN=Y

W ~/.profilemam układ następujące (Wymień ENVz BASH_ENVprzy użyciu bash):


if [[ -n $SSH_LOGIN || -z $ENV ]]; then
     # Put here login initialization code
     unset SSH_LOGIN
     ENV=~/.profile
fi
 # Put here code thats get executed with each ksh/sh invocation

eremmel
źródło
0

Bash czyta ~/.profiletylko wtedy, gdy jest to powłoka logowania i ~/.bash.bashrctylko wtedy, gdy ma terminal, z których żaden nie jest domyślnie prawdziwy przy wywoływaniu polecenia za pomocą ssh. Istnieje jednak kilka innych opcji ustawiania środowiska na serwerze, wszystkie niestety w zależności od konfiguracji systemu:

  • Zsh czyta ~/.zshenvnawet w tym przypadku; nie ma jednak odpowiedniego pliku konfiguracyjnego dla bash.
  • Jeśli PermitUserEnvironmentopcja jest włączona /etc/sshd_config, ssh przeczyta ~/.ssh/environment. Niestety ta opcja jest domyślnie wyłączona.
  • Jeśli pam_env.sozostanie wywołane z user_readenv=1in /etc/pam.d/sshd, będzie czytać ~/.pam_environment. Chociaż nie jest to domyślny moduł, jest tak nazywany przynajmniej w Ubuntu .
  • Jeśli wszystko inne zawiedzie, możesz umieścić command=dyrektywę w pliku autoryzowanych kluczy, wywołując skrypt opakowania, który ustawia środowisko i wykonuje$SSH_ORIGINAL_COMMAND na końcu (ja to polecenie dotyczy powłoki, więc eval jest tutaj właściwe, ale nie jestem pewien) .
Jan Hudec
źródło
0

Prawdopodobnie masz ~/.bash_profile, który zastępuje ~/.profile.

użytkownik541686
źródło