Dlaczego / etc / profile nie jest wywoływany dla powłok niezalogowanych?

51

Powłoka logowania i niezalogowania zdefiniowana jako:

su - $USER # will give you a login shell
bash # will give you a non-login shell

/ etc / profile nie jest wywoływany dla powłok niezalogowanych, na przykład podczas uruchamiania konsoli (kde). / etc / profile jest wywoływany tylko dla powłok logowania.

Dlaczego? Proszę wyjaśnij, ponieważ lubię rozumieć uzasadnienie tego.

James Mitch
źródło

Odpowiedzi:

100

/etc/profile jest wywoływany tylko dla powłok logowania, ponieważ jest to jego szczególny cel.

Jeśli chcesz, aby polecenie było uruchamiane dla interaktywnych powłok, które nie są powłokami logowania, a używasz bash, umieść je w ~/.bashrclub /etc/bash.bashrc.

Pliki „profilu” mają zawierać polecenia, które powinny być uruchamiane tylko dla powłok logowania. Te pliki to:

  • /etc/profile, uruchamiany przez wszystkie powłoki zgodne z Bourne (w tym bashi dash), gdy jest uruchamiany jako powłoka logowania.

  • Skrypty w /etc/profile.d.

    Dotyczy to powłok w stylu Bourne'a, ale nie jest zakodowane w samym pliku wykonywalnym powłoki. Zamiast tego /etc/profilewywołuje je polecenia. Na przykład w moim systemie Ubuntu 12.04 /etc/profilezawiera następujące wiersze:

    if [ -d /etc/profile.d ]; then
      for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
          . $i
        fi
      done
      unset i
    fi
    
  • .profile w katalogu osobistym użytkownika, uruchamianym przez powłoki zgodne z Bourne, gdy jest uruchamiany jako powłoka logowania (chyba że zostanie zastąpiona, patrz poniżej).

  • .bash_profilelub .bash_loginw katalogu osobistym użytkownika. Są one ignorowane przez powłoki inne niż bash. Ale jeśli .bash_profileistnieje, bashuruchamia go zamiast .profile . Jeśli .bash_profilenie istnieje, ale .bash_loginistnieje, to jest uruchamiane zamiast .profile.

    (Ale to jest wspólne dla .bash_profilelub .bash_login, jeśli istnieje, jest napisany tak, aby * jawnie wywołać .profile).

    Zaletą plików profili specyficznych dla powłoki jest to, że mogą one zawierać polecenia lub składnię, które są poprawne tylko dla tej powłoki. Na przykład mogę użyć [[operatora oceny w .bash_profile/, .bash_loginale jeśli go użyję, .profilea następnie zaloguję się dashjako moja powłoka, zakończy się niepowodzeniem.

Co powinno się znajdować w plikach „profilowych”

Pliki „profil” powinny zawierać polecenia, które powinny być uruchamiane tylko raz, na początku logowania. (Obejmuje to również logowanie graficzne, ponieważ zaczynają się one również od powłoki logowania.) Jeśli powłoka jest interaktywna, użytkownik, który ją uruchomił, jest prawdopodobnie zalogowany, a więc prawdopodobnie ma przodka (który ją uruchomił lub co go uruchomił, lub zaczął to itp.), który był powłoką logowania.

Możesz uruchomić polecenie tylko raz, ponieważ:

  1. nie ma powodu, aby uruchamiać go więcej niż jeden raz na logowanie, byłoby to nieefektywne lub
  2. przyniosłoby to niepożądany wynik, aby uruchomić go więcej niż raz podczas logowania.

Jako przykład drugiej sytuacji, w której wystąpiłby niepożądany wynik, rozważ te linie, które domyślnie pojawiają się u każdego użytkownika ~/.profile:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Załóżmy, że korzystasz z SSH, uruchomiłeś inną powłokę (powiedzmy zsh), w pewnym momencie okazało się, że chcesz tymczasowo wrócić, bashale zachować swoje środowisko (więc uruchomiłem bashponownie, gdy jesteś w zsh), a następnie uruchomiłeś podobny program, mcktóry uruchamia powłokę jako część jego interfejsu. Jeśli binistnieje w twoim katalogu domowym, a twoja nazwa użytkownika to james, twoja PATHw najbardziej wewnętrznej powłoce przypomina:

/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Jest to nieefektywne i (co ważniejsze) utrudnia zrozumienie treści PATH.

Nie jest to jednak katastrofa. O ile wiem, jeśli każda interaktywna powłoka pozyska pliki „profilu”, nic złego się nie stanie, w domyślnej konfiguracji . Ponieważ jednak celem plików „profilowych” jest zawieranie poleceń uruchamianych tylko raz podczas logowania , użytkownik lub administrator może dodawać polecenia do profilu, które muszą być uruchamiane tylko podczas uruchamiania powłoki logowania.

Gdzie umieścić polecenia dla każdej interaktywnej powłoki do uruchomienia

Jeśli używasz bash, w każdej interaktywnej powłoce znajdują się pliki poleceń.

  • /etc/bash.bashrc
  • .bashrc w katalogu osobistym użytkownika.

Jest to najczęściej używane do poleceń, które

  1. wpływają tylko na środowisko powłoki, w której działają - nawet na powłoki potomne lub
  2. powinien działać, nawet jeśli nie jest to powłoka logowania.

Na przykład, uzupełnianie tabulacji w wierszu poleceń powinno być ogólnie włączone niezależnie od tego, czy bashbyła to powłoka logowania. To pojawia się w ~/.bashrc:

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

Obowiązują oba 1 i 2 : to nie przenosi się na inne powłoki uruchomione w tym, a uzupełnianie tabulatorami powinno działać, bashnawet jeśli zalogowałem się przy użyciu innej powłoki.

Gdzie umieścić polecenia dotyczące powłok logowania i interaktywnych powłok bez logowania

Jeśli używasz bashi chcesz, aby polecenie było uruchamiane w powłokach logowania i powłokach interaktywnych, które nie są powłokami logowania, zwykle wystarczy umieścić je w /etc/bash.bashrclub~/.bashrc . Dzieje się tak dlatego, domyślnie /etc/profilei ~/.profileuruchomić je wyraźnie. Na przykład ~/.profilema:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

(Podobnie /etc/profileźródła /etc/bash.bashrcdla bash.)

Zatem zarówno pliki „profil”, jak i „rc” są uruchamiane podczas uruchamiania bashpowłoki interaktywnej (niezależnie od tego, czy jest to powłoka logowania).

Gdzie umieścić polecenia do uruchomienia w nieinteraktywnych powłokach

Prawdopodobnie nie chcesz określać żadnych poleceń dla wszystkich nieinteraktywnych powłok; będą one działać przy każdym uruchomieniu skryptu (pod warunkiem, że skrypt jest uruchamiany przez powłokę skonfigurowaną do ich uruchamiania).

Może to spowodować znaczne uszkodzenie. Jeśli masz zamiar to zrobić, a w systemie nie ma konta administratora oprócz tego, którego używasz, możesz je utworzyć; które mogą ułatwić naprawianie błędów.

W bashpliki „rc” są rzeczywiście uruchomić czy powłoka jest interaktywna, czy nie . Jednak na górze mówią:

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

Jeśli więc potrzebujesz komend do automatycznego uruchamiania się nawet w nieinteraktywnych powłokach, takich jak te uruchamiane w celu wykonywania skryptów, możesz dodać swoje komendy przed tymi wierszami.

Uruchamianie powłoki logowania

Logowanie uruchamia powłokę logowania. Jeśli chcesz, aby powłoka uruchomiona później działała jako powłoka logowania, zacznij od -lflagi (oznacza l ogin ). Na przykład:

Jest to najlepszy sposób na uruchomienie powłoki logowania (bez logowania), chyba że chcesz uruchomić ją jako inny użytkownik. Następnie użyj:

  • sudo -idla root(użyj sudo -sdla niezalogowanej, interaktywnej powłoki roota)
  • sudo -u username -i dla każdego użytkownika
  • su - usernamedla osób niebędących rootużytkownikami (użyj do interaktywnej powłoki roota bez logowania)su username

Co to jest wstępna powłoka logowania?

Wstępna powłoką zgłoszeniową jest taka sama jak powłoki logowania . Wszędzie ta odpowiedź mówi „powłoka logowania”, może powiedzieć „początkowa powłoka logowania” (z wyjątkiem tej sekcji, która już przestałaby mieć sens).

Jednym z powodów terminu „ początkowa powłoka logowania” jest to, że powłoka logowania jest również używana w innym znaczeniu - w celu określenia, który program jest używany jako powłoka, która jest wykonywana podczas logowania. Jest to sens powłoki logowania używanej do powiedzenia:

  • „ Domyślną powłoką logowania OpenBSD jest ksh; w Ubuntu jest” bash.
  • „Możesz zmienić powłokę logowania za pomocą chsh.”

Dalsza lektura

Eliah Kagan
źródło
4
Jedna z najlepszych odpowiedzi na dowolne pytanie w dowolnej witrynie Stack Exchange.
Mark E. Haase,
1
> Pliki „profil” powinny zawierać polecenia, które powinny być uruchamiane tylko raz, na początku logowania. (Obejmuje to także logowanie graficzne, ponieważ zaczynają się one również od powłoki logowania.) Nie nie nie nie nie! Absolutnie nie! Wszystkie powłoki podobne do bourne odczytują tylko .profile podczas interaktywnych sesji powłoki logowania , tj. Tych, które albo rozpoczęły się z opcją -i, albo te podłączone do terminala sterującego (z których żadna nie jest prawdą, jeśli powłoka została uruchomiona przez menedżera wyświetlania). Powodem tego jest fakt, że celem tego pliku jest skonfigurowanie terminala użytkownika , a nie tylko jego środowiska. Jeśli menedżer wyświetlania tr
Eliah, odtworzyłem resztę komentarza Dereka tutaj, ale zostawiłem powyższy kikut, więc dostanie on powiadomienie o odpowiedzi, chociaż nie będzie w stanie odpowiedzieć na to z powodu wymagań dotyczących reputacji. Dałem mu jednak dostęp do zapisu w powyższym czacie.
Seth
1
In bash, the "rc" files are actually run whether the shell is interactive or not. jest nieprawidłowe. /etc/bash.bashrc jest uruchamiany przez /etc/bash.profile.
okwap
okwap ma rację, rc plików nie uzyskać przywołane w nieinterakcyjnym powłoki, to jest to bardziej zwięzłe i trafne.
Nick Allen,