Zrozumienie konfiguracji powłoki bash na startup

Zrozumienie konfiguracji powłoki bash na startup

Od lat powłoka bash [1] była integralną częścią wielu rozkładów Linuksa. Na początku Bash został wybrany jako oficjalna skorupa GNU, ponieważ była dobrze znana, całkiem stabilna i oferowała przyzwoity zestaw funkcji.

Dziś sytuacja jest nieco inna - Bash jest nadal obecny wszędzie jako pakiet oprogramowania, ale został zastąpiony alternatywami w standardowej instalacji. Należą do nich na przykład Debian Almquist Shell (Dash) [2] (dla Debian GNU/Linux) lub ZSH [3] (dla Grml [5]). W dobrze znanych dystrybucjach Ubuntu, Fedora, Arch Linux i Linux Mint, Bash pozostał standardową powłoką.

Bardzo pomocne jest zrozumienie startupu Bash i wiedzieć, jak poprawnie to skonfigurować. Obejmuje to na przykład dostosowanie środowiska powłoki. Również przyjrzymy się dwóm plikom .bashrc i .bash_profile, które są czytane na startup. Odpowiednia wiedza jest testowana na egzaminie 1 certyfikatu Linux Professional Institute [4].

Porównanie interaktywnej logowania i nieinteraktywnej powłoki wsadowej

Ogólnie rzecz biorąc, skorupa ma dwa tryby działania. Może działać jako interaktywna powłoka logowania i jako nieinteraktywna powłoka wsadowa. Tryb działania definiuje uruchamianie bash i które pliki konfiguracyjne są odczytywane [7]. Tryb działania można zróżnicować w następujący sposób [6]-interaktywna powłoka logowania, interaktywna nieinteraktywna powłoka logowania, nieinteraktywna powłoka nieinteraktywna (BATCH) nie-loginowa.

Mówiąc prosto, interaktywna powłoka czyta i zapisuje terminal użytkownika. Natomiast nieinteraktywna powłoka nie jest powiązana z terminalem, tak jak podczas wykonywania skryptu powłoki wsadowej. Interaktywną skorupą może być login lub powłoka nie login.

Interaktywna powłoka logowania

Ten tryb odnosi się do logowania na komputerze na komputerze lokalnym za pomocą terminala, który waha się od TTY1 do Tty4 (zależy od instalacji - może być mniej więcej terminali). Ponadto ten tryb obejmuje zdalnie logowanie się do komputera, na przykład za pomocą bezpiecznej powłoki (SSH) w następujący sposób:

$ ssh użytkownik@remote-system
$ SSH User@Remote-System Remote-command

Pierwsze polecenie łączy się z systemem zdalnym i otwiera tylko interaktywną powłokę. Natomiast drugie polecenie łączy się z systemem zdalnym, wykonuje podane polecenie w nieinteraktywnej powładzie logowania i kończy połączenie SSH. Poniższy przykład pokazuje to bardziej szczegółowo:

$ SSH LocalHost Time
Użytkownik@hasło LocalHost:
11:58:49 w górę 23 dni, 11:41, 6 użytkowników, średnia ładowanie: 0,10, 0,14, 0,20
$

Aby dowiedzieć się, czy jesteś zalogowany do komputera za pomocą powłoki logowania, wpisz następujące polecenie Echo w terminalu:

$ echo 0 $
-grzmotnąć
$

W przypadku powłoki logowania wyjście zaczyna się od „-”, a następnie nazwy powłoki, która w naszym przypadku powoduje „-bash”. W przypadku powłoki nie-loginowej wyjście to tylko nazwa powłoki. Poniższy przykład pokazuje to dla dwóch poleceń ECHO 0 USD, a czas pracy jest przekazywany SSH jako parametr ciągów:

$ ssh localhost "echo 0 $;
Użytkownik@hasło LocalHost:
grzmotnąć
11:58:49 w górę 23 dni, 11:41, 6 użytkowników, średnia ładowanie: 0,10, 0,14, 0,20
$

Alternatywnie użyj wbudowanej komendy Shopt [8] w następujący sposób:

$ shopt login_shell
login_shell Off
$

W przypadku powłoki nie-loginowej polecenie zwraca „wyłączone”, a dla logowania „ON”.

Jeśli chodzi o konfigurację tego typu powłoki, brane są trzy pliki. To są/etc/profilu, ~/.profil i ~/.bash_profile. Szczegółowy opis tych plików znajduje się poniżej.

Interaktywna skorupa nie-loginowa

Ten tryb opisuje otwarcie nowego terminalu, na przykład xterm lub gnome i wykonanie w nim powłoki. W tym trybie dwa pliki/etc/bashrc i ~/.Bashrc są czytane. Szczegółowy opis tych plików znajduje się poniżej.

Nieinteraktywna skorupa nie-loginowa

Ten tryb jest używany podczas wykonywania skryptu powłoki. Skrypt powłoki działa we własnej subshell. Jest klasyfikowany jako nieinteraktywny, chyba że prosi o wprowadzenie użytkownika. Powłoka otwiera się tylko na wykonanie skryptu i natychmiast zamyka go po zakończeniu skryptu.

./skrypt lokalny.cii

Nieinteraktywna powłoka logowania

Ten tryb obejmuje logowanie do komputera ze zdalnego, na przykład, przez Secure Shell (SSH). Skrypt lokalny skryptu powłoki.SH jest prowadzony lokalnie, najpierw, a jego wyjście jest używane jako wejście SSH.

./skrypt lokalny.sh | SSH User@Remote-System

Uruchamianie SSH bez żadnego dalszego polecenia rozpoczyna powłokę logowania w systemie zdalnym. W przypadku, gdy urządzenie wejściowe (stdin) SSH nie jest terminal, SSH uruchamia nieinteraktywną powłokę i interpretuje wyjście skryptu jako polecenia, które należy wykonać w systemie zdalnym. Poniższy przykład uruchamia polecenie uptime w systemie zdalnym:

$ echo „Uptime” | SSH Localhost
Pseudo-końcowy nie zostanie przydzielony, ponieważ stdin nie jest terminal.
frank@localhost hasło:
Programy zawarte w systemie Debian GNU/Linux są bezpłatnym oprogramowaniem;
Dokładne warunki dystrybucji dla każdego programu są opisane w
Poszczególne pliki w/usr/share/doc/*/Copyright.
Debian GNU/Linux w zakresie nie ma gwarancji, w zakresie
dozwolone przez obowiązujące prawo.
Masz nową pocztę.
11:58:49 w górę 23 dni, 11:41, 6 użytkowników, średnia ładowanie: 0,10, 0,14, 0,20
$

Co ciekawe, SSH narzeka, że ​​Stdin nie jest terminalem i pokazuje wiadomość dnia (MOTD), która jest przechowywana w globalnym pliku konfiguracyjnym /etc /motd. Aby skrócić wyjście terminala, dodaj opcję „SH” jako parametr polecenia SSH, jak pokazano poniżej. W rezultacie powłokę jest otwarta najpierw, a dwie polecenia są uruchamiane bez wyświetlania MOTD, najpierw.

$ echo „Uptime” | SSH Localhost Sh
frank@localhost hasło:
12:03:39 w górę 23 dni, 11:46, 6 użytkowników, średnia ładowanie: 0,07, 0,09, 0,16
$$

Następnie przyjrzymy się różnym plikom konfiguracyjnym dla Bash.

Bash Pliki startupowe

Różne tryby bash definiują, które pliki konfiguracyjne są odczytywane podczas uruchamiania:

  • Interaktywna powłoka logowania
    • /etc/profil: Jeśli istnieje, uruchamia polecenia wymienione w pliku.
    • ~/.bash_profile, ~/.bash_login i ~/.Profil (w tej kolejności). Wykonuje polecenia z pierwszego czytelnego pliku znalezionego z listy. Każdy użytkownik może mieć własny zestaw tych plików.
  • Interaktywna skorupa nie-loginowa
    • /etc/bash.BASHRC: Global Bash Configuration. Wykonuje polecenia, jeśli ten plik istnieje i jest czytelny. Dostępne tylko w Debian Gnu/Linux, Ubuntu i Arch Linux.
    • ~/.BASHRC: Lokalna konfiguracja bash. Wykonuje polecenia, jeśli ten plik istnieje i jest czytelny.

Pomocne może być postrzeganie tego jako wykresu. Podczas badań znaleźliśmy poniższy obraz, który bardzo nam się podoba [9].


obraz: Config-Path.png
tekst: Proces oceny konfiguracji BASH

Wyjaśnione różne pliki konfiguracyjne

W przypadku plików wyjaśnionych poniżej nie ma ogólnego zestawu reguł, na której opcji przechowywać w której pliku (z wyjątkiem globalnych opcji vs. opcje lokalne). Ponadto zamówienie odczytane pliki konfiguracyjne jest zaprojektowane z myślą o elastyczności, aby zmiana używanej powłoki zapewnia nadal korzystać z systemu Linux. Dlatego używanych jest kilka plików, które konfigurują to samo.

/itp./Profil

Ten plik jest używany przez Bourne Shell (SH), a także kompatybilne z Bourne Shells, takie jak Bash, Ash i KSH. Zawiera domyślne wpisy dla zmiennych środowiskowych dla wszystkich użytkowników, którzy logują się interaktywnie. Na przykład wpływa to na ścieżkę $ i szybki projekt dla zwykłych użytkowników, a także użytkownika o nazwie „root”. Poniższy przykład pokazuje część/etc/profil z Debian GNU/Linux.

seciuserpath ()
# Wspólne katalogi do wykonywalnych dla wszystkich użytkowników
Path = "/usr/local/bin:/usr/bin:/bin"
# Test dla użytkownika root, aby dodać programy administracyjne systemu
jeśli [„'id -u'" -eq 0]; Następnie
Path = "/usr/local/sbin:/usr/sbin:/sbin: $ ścieżka"
w przeciwnym razie
Ścieżka = "/usr/local/games:/usr/games: $ ścieżka"
fi
Ścieżka eksportu

SetuserPath ()
# PS1 jest podstawowym ciągiem wiersza polecenia
jeśli [„$ ps1”]; Następnie
Jeśli [„$ bash”] && [„$ bash” != "/bin/sh"]; Następnie
# Bash pliku.Bashrc już ustawia domyślny PS1.
# Ps1 = "\ h: \ w \ $"
Jeśli [-f /etc /bash.bashrc]; Następnie
. /etc/bash.Bashrc
fi
w przeciwnym razie
jeśli [„'id -u'" -eq 0]; Następnie
Ps1 = '#'
w przeciwnym razie
Ps1 = '$'
fi
fi
fi

Dalsze pliki konfiguracyjne można zapisać w katalogu /itp. /Profil.D. Są one pozyskiwane do konfiguracji BASH, gdy tylko /etc /profil jest odczytany.

~/.bash_profile

Ten lokalny plik konfiguracyjny jest odczytany i wykonywany, gdy bash jest wywoływany jako interaktywna powłoka logowania. Zawiera polecenia, które powinny działać tylko raz, takie jak dostosowanie zmiennej środowiska $ ścieżka.

Wypełnienie ~/.bash_profile tylko z liniami takimi jak to źródło .plik bashrc. Oznacza to, że za każdym razem, gdy zalogujesz się do terminalu, zawartość konfiguracji lokalnej baszy jest odczytywana.

Jeśli [-f ~//.bashrc]; Następnie
. ~/.Bashrc
fi

Jeśli plik ~/.Bash_profile istnieje, a następnie Bash pominnie czytanie z ~/.bash_login (lub ~//.profil).

~/.bash_login

Dwa pliki ~/.bash_profile i ~/.bash_login jest analogiczny.

~/.profil

Większość dystrybucji Linux używa tego pliku zamiast ~/.bash_profile. Służy do zlokalizowania pliku lokalnego .bashrc i rozszerzyć zmienną $ ścieżki.

# Jeśli uruchamia bash
jeśli [-n „$ bash_version”]; Następnie
# włączać .bashrc, jeśli istnieje
Jeśli [-f "$ home/.bashrc ”]; wtedy
. "$ Dom/.bashrc "
fi
fi
# Ustaw ścieżkę, aby zawiera prywatny kosz, jeśli istnieje
jeśli [-d „$ home/bin”]; Następnie
Ścieżka = "$ home/bin: $ ścieżka"
fi

Ogólnie rzecz biorąc, ~/.Profil jest czytany przez wszystkie powłoki. Jeśli albo ~/.bash_profile lub ~/.Bash_login istnieje, Bash nie odczytuje tego pliku.

/etc/bash.bashrc i ~/.Bashrc

Ten plik zawiera konfigurację bash i obsługuje lokalne aliasy, limity historii przechowywane w .bash_history (patrz poniżej) i ukończenie Bash.

# Nie umieszczaj duplikat linii ani linii, zaczynając od przestrzeni w historii.
# Zobacz Bash (1) Aby uzyskać więcej opcji
HistControl = IgnoroBoth
# Dodaj do pliku historii, nie zastępuj go
Shopt -s Histappend
# Aby uzyskać długość historii, patrz Histsize i Histfilesize w Bash (1)
Histsize = 1000
HistfileSize = 2000

Co skonfigurować w jakim pliku

Jak dowiedziałeś się do tej pory, nie ma ani jednego pliku, ale grupa plików do konfigurowania bash. Pliki te istnieją tylko z powodów historycznych - zwłaszcza sposobu ewolucji różnych skorup i pożyczonych przydatnych funkcji. Ponadto nie ma żadnych ścisłych zasad, które

Zdefiniuj, który plik ma zachować określony element konfiguracji. Są to zalecenia, które mamy dla Ciebie (na podstawie TLDP [10]):

  • Wszystkie ustawienia, które chcesz zastosować w środowiskach wszystkich użytkowników, powinny znajdować się w /etc /profil.
  • Wszystkie globalne aliasy i funkcje powinny być przechowywane w /etc /bashrc.
  • Plik ~/.Bash_profile to preferowany plik konfiguracyjny do indywidualnego konfigurowania środowisk użytkowników. W tym pliku użytkownicy mogą dodawać dodatkowe opcje konfiguracji lub zmienić ustawienia domyślne.
  • Wszystkie lokalne aliasy i funkcje powinny być przechowywane w ~/.Bashrc.

Należy również pamiętać, że Linux jest zaprojektowany tak, aby był bardzo elastyczny: jeśli którykolwiek z plików startupowych wymienionych powyżej nie jest obecny w twoim systemie, możesz go utworzyć.

Linki i referencje

  • [1] GNU Bash, https: // www.gnu antylopa.org/oprogramowanie/bash/
  • [2] Debian Almquist Shell (Dash), http: // gondor.Apana.org.Au/~ Herbert/Dash/
  • [3] Zsh, https: // www.Zsh.org/
  • [4] Certyfikacja Linux Professional Institute (LPIC), poziom 1, https: // www.LPICE.UE/en/nasze certyfikacje/LPIC-1
  • [5] Grml, https: // grml.org/
  • [6] Zróżnicuj interaktywne logowanie i nieinteraktywne nie-loginowe powłoki, Askubuntu, https: // askubuntu.COM/PYTANIA/879364/różnicowa interaktywna login i non-non-interaktywna-non-login-szell
  • [7] Bash Startup Files, https: // www.gnu antylopa.Org/Software/Bash/Manual/Html_Node/Bash-Startup-Files.HTML#Bash-Startup-Files
  • [8] sklep wbudowany, https: // www.gnu antylopa.org/oprogramowanie/bash/manual/html_node/the-shopt-builtin.html
  • [9] Wprowadzenie Unix - Zakaz ładowania plików uruchamiania Bash, https: // medium.com/@youngstone89/unix-introdukcja-bash-startup-files-loading-rzędu-562543ac12e9
  • [10] Projekt dokumentacji Linux (TLDP), https: // tldp.org/ldp/bash-beginners-guide/html/sect_03_01.html

Dziękuję

Autor chciałby podziękować Geroldowi Rupprechtowi za jego radę podczas pisania tego artykułu.