Administrator systemu Linux - skrypty powłoki
Wprowadzenie do Bash Shell
Podobnie jak różne odmiany systemu GNU Linux, powłoki występują w wielu odmianach i różnią się pod względem kompatybilności. Domyślna powłoka w CentOS jest znana jako powłoka Bash lub Bourne Again. Powłoka Bash to nowoczesna, zmodyfikowana wersja powłoki Bourne Shell opracowana przez Stephena Bourne'a. Bash był bezpośrednim zamiennikiem oryginalnego Thompson Shell w systemie operacyjnym Unix opracowanym w Bell Labs przez Kena Thompsona i Dennisa Ritchiego (Stephen Bourne był również zatrudniony przez Bell Labs)
Każdy ma swoją ulubioną muszlę i każdy ma swoje mocne strony i trudności. Ale w większości Bash będzie domyślną powłoką we wszystkich dystrybucjach Linuksa i najczęściej dostępną. Z doświadczeniem każdy będzie chciał odkrywać i używać skorupy, która jest dla niego najlepsza. Jednak w tym samym czasie każdy będzie chciał opanować powłokę Bash.
Inne powłoki Linuksa to: Tcsh, Csh, Ksh, Zsh i Fish.
Rozwijanie umiejętności korzystania z dowolnej powłoki Linuksa na poziomie eksperta jest niezwykle ważne dla administratora CentOS. Jak wspomnieliśmy wcześniej, w przeciwieństwie do systemu Windows, sercem Linuksa jest system operacyjny wiersza poleceń. Powłoka to po prostu interfejs użytkownika, który umożliwia administratorowi (lub użytkownikowi) wydawanie poleceń systemowi operacyjnemu. Gdyby administrator systemu Linux był pilotem linii lotniczych, używanie powłoki byłoby podobne do zdjęcia samolotu z autopilota i chwytania ręcznych elementów sterujących w celu uzyskania bardziej zwrotnego lotu.
Powłoka Linuksa, taka jak Bash, jest znana w informatyce jako plik Command Line Interpreter. Microsoft Windows ma również dwa interpretery wiersza poleceń zwane DOS (nie mylić z oryginalnym systemem operacyjnym DOS) i PowerShell.
Większość nowoczesnych muszli, takich jak Bash, zapewnia constructsumożliwienie bardziej złożonym skryptom powłoki automatyzacji zarówno typowych, jak i złożonych zadań.
Konstrukcje obejmują -
- Kontrola przepływu skryptów (ifthen i else)
- Logiczne operacje porównania (większe niż, mniejsze niż, równość)
- Loops
- Variables
- Parametry określające działanie (podobnie jak przełączniki z poleceniami)
Używanie skryptu powłoki a język skryptów
Często myśląc o wykonaniu zadania, administratorzy zadają sobie pytanie: czy powinienem używać skryptu powłoki, czy języka skryptowego, takiego jak Perl, Ruby czy Python?
Nie ma tutaj ustalonej reguły. Istnieją tylko typowe różnice między powłokami a językami skryptowymi.
Muszla
Shell pozwala na użycie poleceń Linuksa, takich jak sed , grep , tee , cat i wszystkich innych narzędzi opartych na wierszu poleceń w systemie operacyjnym Linux. W rzeczywistości prawie każde narzędzie Linuksa z wiersza poleceń może być skryptowane w powłoce.
Świetnym przykładem użycia powłoki byłby szybki skrypt sprawdzający listę hostów pod kątem rozpoznawania nazw DNS.
Nasz prosty skrypt Bash do sprawdzania nazw DNS -
#!/bin/bash
for name in $(cat $1);
do
host $name.$2 | grep "has address"
done
exit
mała lista słów do testowania rozpoznawania nazw DNS -
dns
www
test
dev
mail
rdp
remote
Dane wyjściowe dotyczące domeny google.com -
[rdc@centos ~]$ ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote
[rdc@centos ~]$
Wykorzystując proste polecenia Linuksa w naszej powłoce, byliśmy w stanie stworzyć prosty 5-liniowy skrypt do audytu nazw DNS z listy słów. Zajęłoby to trochę czasu w Perlu, Pythonie lub Ruby, nawet przy użyciu ładnie zaimplementowanej biblioteki DNS.
Język skryptowy
Język skryptowy zapewni większą kontrolę poza powłoką. Powyższy skrypt Bash używał otoki wokół polecenia hosta Linuksa . A co by było, gdybyśmy chcieli zrobić więcej i stworzyć własną aplikację, taką jak host, do interakcji poza powłoką? Tutaj używalibyśmy języka skryptowego.
Ponadto dzięki dobrze utrzymywanemu językowi skryptowemu wiemy, że nasze działania będą w większości działały w różnych systemach. Na przykład Python 3.5 będzie działał na każdym innym systemie z zainstalowanym Pythonem 3.5 z tymi samymi bibliotekami. Nie tak, jeśli chcemy uruchomić nasz skrypt BASH zarówno w systemie Linux, jak i HP-UX.
Czasami granice między językiem skryptowym a potężną powłoką mogą zostać zatarte. Możliwe jest zautomatyzowanie zadań administracyjnych CentOS Linux za pomocą Python, Perl lub Ruby. Takie postępowanie jest naprawdę dość powszechne. Ponadto zamożni programiści skryptów powłoki stworzyli prostego, ale funkcjonalnego demona serwera internetowego w Bash.
Mając doświadczenie w językach skryptowych i automatyzacji zadań w powłokach, administrator CentOS będzie mógł szybko określić, od czego zacząć, gdy trzeba rozwiązać problem. Rozpoczęcie projektu za pomocą skryptu powłoki jest dość powszechne. Następnie przejdź do języka skryptowego (lub skompilowanego), gdy projekt staje się bardziej złożony.
Ponadto w różnych częściach projektu można używać zarówno języka skryptowego, jak i skryptu powłoki. Przykładem może być skrypt Perla do zeskrobania strony internetowej. Następnie użyj skryptu powłoki, aby przeanalizować i sformatować za pomocą sed , awk i egrep . Na koniec użyj skryptu PHP do wstawiania sformatowanych danych do bazy danych MySQL za pomocą internetowego interfejsu GUI.
Mając pewną teorię dotyczącą powłok, zacznijmy od podstawowych bloków konstrukcyjnych do automatyzacji zadań z powłoki Bash w CentOS.
Wejście Wyjście i przekierowanie
Przetwarzanie wyjścia standardowego na inne polecenie -
[rdc@centos ~]$ cat ~/output.txt | wc -l
6039
[rdc@centos ~]$
Powyżej przekazaliśmy kocie buźkę do wc w celu przetworzenia z postacią potoku . wc następnie przetworzył dane wyjściowe z cat , wypisując liczbę wierszy z output.txt do terminala. Potraktuj znak potoku jako „potok” przekazujący wyjście z jednego polecenia do przetworzenia przez następne polecenie.
Poniżej przedstawiono kluczowe pojęcia, o których należy pamiętać podczas przekierowywania poleceń -
Numer | Deskryptor pliku | Postać |
---|---|---|
0 | standardowe wejście | < |
1 | standardowe wyjście | > |
2 | Standardowy błąd | |
dołącz stdout | >> | |
przypisać przekierowanie | & | |
wyjście potoku do wejścia standardowego | | |
Wprowadziliśmy to w rozdziale pierwszym, nie mówiąc zbytnio o przekierowaniu lub przypisywaniu przekierowań. Podczas otwierania terminala w systemie Linux Twoja powłoka jest postrzegana jako domyślny cel dla -
- standardowe wejście <0
- standardowe wyjście> 1
- błąd standardowy 2
Zobaczmy, jak to działa -
[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2
COMMAND PID USER **FD** TYPE DEVICE SIZE/OFF NODE NAME
bash 13684 rdc **0u** CHR 136,0 0t0 3 /dev/pts/0
bash 13684 rdc **1u** CHR 136,0 0t0 3 /dev/pts/0
bash 13684 rdc **2u** CHR 136,0 0t0 3 /dev/pts/0
[rdc@centos ~]$
/ dev / pts / 0 to nasz pseudoterminal. CentOS Linux patrzy na to i myśli o naszej otwartej aplikacji terminalowej jak o prawdziwym terminalu z klawiaturą i wyświetlaczem podłączonymi przez interfejs szeregowy. Jednak tak jak hiperwizor abstraktuje sprzęt do systemu operacyjnego / dev / pts abstraktuje nasz terminal do aplikacji.
Z powyższego polecenia lsof możemy zobaczyć podFDkolumna, w której wszystkie trzy deskryptory plików są ustawione na nasz wirtualny terminal (0,1,2). Możemy teraz wysyłać polecenia, wyświetlać dane wyjściowe polecenia, a także wszelkie błędy związane z poleceniem.
Poniżej znajdują się przykłady STDIN i STDOUT -
STDOUT
[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT.
[root@centosLocal centos]#
Możliwe jest również wysłanie zarówno stdout, jak i stderr do oddzielnych plików -
bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#
Podczas przeszukiwania całego systemu plików napotkano dwa błędy. Każde z nich zostało przesłane do oddzielnego pliku do późniejszego wglądu, a zwrócone wyniki zostały umieszczone w oddzielnym pliku tekstowym.
Wysyłanie stderr do pliku tekstowego może być przydatne podczas robienia rzeczy, które wysyłają dużo danych do terminala, takich jak kompilowanie aplikacji. Umożliwi to przeglądanie błędów, które mogą zostać utracone w historii przewijania terminala.
Jedna uwaga dotycząca przekazywania STDOUT do pliku tekstowego to różnice między >> i >. Podwójne „>>” zostanie dołączone do pliku, podczas gdy forma pojedyncza zbije plik i zapisze nową zawartość (więc wszystkie poprzednie dane zostaną utracone).
STDIN
[root@centosLocal centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.
[root@centosLocal centos]#
W powyższym poleceniu plik tekstowy stdin.txt został przekierowany do polecenia cat, które odesłało jego zawartość do STDOUT .
Pionowa kreska „|”
Znak potoku pobierze dane wyjściowe z pierwszego polecenia, przekazując je jako dane wejściowe do następnego polecenia, umożliwiając drugiemu poleceniu wykonanie operacji na wyjściu.
Teraz „prześlijmy” standardowe wyjście kota do innego polecenia -
[root@centosLocal centos]# cat output.txt | wc -l
2
[root@centosLocal centos]#
Powyżej wc wykonuje obliczenia na wyjściu kota, który został przekazany z rury. Polecenie pipe jest szczególnie przydatne podczas filtrowania danych wyjściowych z grep lub egrep -
[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l
9000
[root@centosLocal centos]#
W powyższym poleceniu przekazaliśmy każdą 4-cyfrową liczbę do wc z pliku tekstowego zawierającego wszystkie liczby od 65535, które przeszły przez filtr egrep .
Przekierowywanie wyjścia za pomocą &
Dane wyjściowe można przekierować za pomocą &postać. Jeśli chcemy skierować wyjście zarówno STDOUT, jak i STDERR, do tego samego pliku, można to zrobić w następujący sposób -
[root@centosLocal centos]# find / -name passwd > out.txt 2>&1
[root@centosLocal centos]# cat out.txt
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
/etc/passwd
[root@centosLocal centos]#
Przekierowywanie przy użyciu &znak działa w ten sposób: najpierw wyjście jest przekierowywane do out.txt . Po drugie, STDERR lub deskryptor pliku 2 jest ponownie przypisywany do tej samej lokalizacji co STDOUT, w tym przypadku out.txt .
Przekierowanie jest niezwykle przydatne i przydaje się podczas rozwiązywania problemów występujących podczas manipulowania dużymi plikami tekstowymi, kompilowania kodu źródłowego, przekierowywania danych wyjściowych w skryptach powłoki i wydawania złożonych poleceń systemu Linux.
Chociaż przekierowanie jest potężne, może być skomplikowane dla nowszych administratorów CentOS. Praktyka, badania i okazjonalne pytania na forum o Linuksie (takie jak Stack Overflow Linux) pomogą rozwiązać zaawansowane rozwiązania.
Konstrukcje Bash Shell
Teraz, gdy już wiemy, jak działa powłoka Bash , nauczmy się kilku podstawowych konstrukcji, powszechnie używanych, do pisania skryptów. W tej sekcji omówimy -
- Variables
- Loops
- Conditionals
- Kontrola pętli
- Czytanie i zapisywanie do plików
- Podstawowe operacje matematyczne
Wskazówki dotyczące rozwiązywania problemów BASH
BASH może być trochę skomplikowany w porównaniu z dedykowanym językiem skryptowym. Niektóre z największych problemów w skryptach BASH są spowodowane nieprawidłową ucieczką lub brakiem ucieczki z operacji skryptowych przekazywanych do powłoki. Jeśli przeglądałeś skrypt kilka razy i nie działa zgodnie z oczekiwaniami, nie martw się. Jest to powszechne nawet w przypadku osób, które codziennie używają BASH do tworzenia złożonych skryptów.
Szybkie przeszukanie Google lub zarejestrowanie się na specjalistycznym forum Linux, aby zadać pytanie, doprowadzi do szybkiego rozwiązania. Jest bardzo prawdopodobne, że ktoś natknął się na dokładny problem i został już rozwiązany.
Skrypty BASH to świetna metoda szybkiego tworzenia zaawansowanych skryptów do wszystkiego, od automatyzacji zadań administracyjnych po tworzenie przydatnych narzędzi. Stanie się ekspertem w tworzeniu skryptów BASH wymaga czasu i praktyki. Dlatego używaj skryptów BASH, gdy tylko jest to możliwe, jest to świetne narzędzie, które można mieć w zestawie narzędzi administracji CentOS.