Konto (super)użytkownika
rejestrowanie via SSH i VNC, powłoka logowania; dostęp do maszyn wirtualnych CentOS 7 i Debian 8 zob. centos/debian.
Kończąc sesję używamy komendy logout. Dlaczego można użyć także komendy
exit? Jaka jest różnica między nimi?
konta superużytkownika (root) i zwykłych użytkowników
Tworzenie dodatkowego konta zwykłego użytkownika i definiowanie dla niego hasła:
# useradd labul99
# passwd labul99
przelogowywanie się z (zwykłego) użytkownika, np. labul, na innego użytkownika
$ su [-] labul99
przelogowywanie się z konta superużytkownika na innego użytkownika
# su [-] labul|labul99
Superużytkownik może wykonać dowolną komendę w imieniu dowolnego użytkownika, np.
# su -c ls labul
wykonywanie przez (zwykłego) użytkownika labul99 komend zarezerwowanych dla superużytkownika:
$ sudo chmod +r /etc/passwd
Dlaczego wykonanie komendy chmod się nie powiodło? Jak zmieni się
zachowanie systemu, jeśli użytkownik labul99 zostanie dodany do grupy wheel?
# usermod -aG wheel labul99
Użytkownik labul99 należy teraz do grupy uniksowej wheel i może wykonywać komendy z
uprawnieniami użytkownika root; zob. wynik działania komendy id.
$ systemctl restart sshd
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: user1
Password:
==== AUTHENTICATION COMPLETE ===
Jak działa komenda sudo systemctl restart sshd?
Zmodyfikuj konfigurację sudo (sudoedit /etc/sudoers), żeby użytkownik labul99 mógł
wykonywać wszelkie komendy z uprawnieniami superużytkownika bez konieczności podawania
hasła (por. z uprawnieniami użytkownika labul).
Uwaga! W systemie Ubuntu pierwszy użytkownik tworzony w czasie instalacji uzyskuje
domyślnie prawa wykonywania komend z uprawnieniami superużytkownika poprzez komendę
sudo.
Powłoka i komendy
Zwykli użytkownicy nie mogą bezpośrednio korzystać z jądra systemu. Można to robić przy pomocy specjalnych programów, które korzystają z wywołań systemowych. Te programy trzeba jednak jakoś uruchamiać.
Powłoka jest specjalnym programem, który pozwala użytkownikowi na wykonywanie pracy w systemie (tworzenie i edycję plików, uruchamianie programów, dostęp do innych, zdalnych systemów, itd.).
Powłoka domyślnie czyta dane wpisywane przez użytkownika na klawiaturze i wypisuje (domyślnie) wyniki działania na monitorze.
Popularne powłoki:
Bourne shell, sh (Stephen. L. Bourne, Unix version 7)
C shell, csh (University of Califorina, Berkley)
Tenex shell, tcsh (ulepszona powłoka csh)
Korn shell, ksh (David Korn)
Bourne-again shell, bash (FSF, Brian Fox, Chet Ramey) – cechy ksh+csh; standardowa powłoka dla Linuksa
Friendly Interactive Shell, fish (https://fishshell.com, bash kontra fish)
Jeśli jesteśmy zarejestrowani w zdalnym systemie w trybie tekstowym (CLI), a chcemy na chwilę przerwać pracę, chcemy uniknąć kłopotów związanych z zerwanym połączeniem sieciowym lub musimy prowadzić prace w wielu powłokach równocześnie, to warto skorzystać z programu tmux (terminal multiplexer).
Z powłoki można korzystać interaktywnie lub poprzez skrypty zawierające sekwencje komend (bash jako język programowania).
Skrypty powinno się pisać używając powłoki, która jest zgodna z odpowiednią normą POSIX (bash, ksh, dash).
Cechy charakterystyczne powłoki
Historia komend – szybkie wykonywanie poprzednich komand
Skrypty – umieszczanie grup komend w osobnych plikach (wykonywalnych)
Aliasy – skrócone nazwy dla długich komend
Zmienne – gromadzenie informacji umożliwiających modyfikowanie działania komend i skryptów
Podstawowe zadania powłoki:
czytaj komendy z terminala lub pliku
sprawdź poprawność komendy
wykonaj komendę, albo uruchom wskazany program
wypisz wyniki na ekran (do pliku)
wróć do punktu początkowego
Komenda sprawdzająca rodzaj powłoki, z której korzystamy
[labul@centos7-1 ~]$ echo $0
-bash
[labul@centos7-1 ~]$ sh
sh-4.2$ echo $0
sh
[labul@centos7-1 ~]$ bash
[labul@centos7-1 ~]$ echo $0
bash
Ile różnych powłok oferuje maszyna wirtualna? cat /etc/shells.
Ogólna struktura komendy jest następująca:
Komenda – co należy zrobić
Opcje – modyfikacja działania komendy
Argumenty – dodatkowe informacje dla komendy
Przykłady:
[labul@centos7-1 ~]$ ls
[labul@centos7-1 ~]$ ls -al /etc
[labul@centos7-1 ~]$ ls -F /etc
Opcje komend
opcje zależą od komendy
opcje w stylu uniksowym: -a, -a -b -c, -abc
opcje w stylu GNU: --all, --create-key
Historia komend
wyświetlanie wcześniejszych komend: history [<liczba ostatnich wierszy>]
wędrówka przez listę komend: <strzałki w górę|dół>
modyfikowanie komendy: <strzałki lewo|prawo>, Ctrl-<strzałki lewo|prawo>,
Ctrl-a, Ctrl-e, Ctrl-d, … (zob. emacs-qr.pdf; set -o vi włącza
skróty wykorzystywane w edytorze vi)
wykonywanie poprzedniej komendy: !!
wykonywanie wcześniejszej komendy: !<numer komendy>
przeszukiwanie historii komend w tył (Ctrl+r) i w przód (Ctrl+s) (zwykle
trzeba dodatkowo zastosować komendę stty -ixon, żeby Ctrl+s nie zatrzymywał terminala)
Zob. także How To Use Bash History Commands and Expansions on a Linux VPS.
Zmienne powłoki
zmienne służą do gromadzenia informacji
wyświetlanie wartości zmiennej: np. echo $HISTSIZE
zmiana wartości: HISTSIZE=5000
zmiany są tymczasowe
utrwalenie zmian wymaga definiowanie zmiennych w pliku ~/.bashrc
Nazwy zmiennych muszą składać się ze znaków alfanumerycznych oraz znaków podkreślenia i
musi zaczynać sie na literę lub znak podkreślenia. Zwyczajowo zmienne środowiskowe, czyli
te, które są eksportowane do uruchamianych komend (programów) i mogą wpływać na ich
działanie. Np. uruchomienie programu crontab -e umożliwia użytkownikowi edycję
właściwego dla niego pliku typu crontab przy użyciu domyślego edytora (vi), jeśli zmienna
środowiskowa EDITOR jest nieokreślona. W przeciwnym razie jest używany edytor wskazany
przez użytkownika.
Wyświetlanie zmiennych:
komenda echo $zmienna służy do wyświetlenia wartości konkretnej zmiennej
komenda set wyświetla wartości wszystkich zdefiniowanych zmiennych
komendy env, export [-p], declare -x, typeset -x wyświetlają tylko
wartości zmiennych środowiskowych.
Zmienna PATH określa, gdzie poszukiwane są komendy do wykonania. Położenie komendy można
określić przy pomocy komendy which lub whereis.
Działanie uruchomionego programu zależy nie tylko użytych opcji i argumentów, ale także wartości zmiennych środowiskowych, z których program korzysta. Porównaj
$ LANG=en_US; printf "%12.3f\n" 123.4
$ LANG=pl_PL; printf "%12.3f\n" 123,4
$ (LANG=en_US; printf "%12.3f\n" 123.4)
Oto lista najważniejszych zmiennych środowiskowych:
EDITOR |
nazwa ulubionego edytora |
HISTSIZE |
liczba ostatnich pamiętanych przez powłokę linii historii |
LANG |
kod stosowanego języka (pl_PL, us_US, en_EN) |
LOGNAME |
nazwa użytkownika, który jest zalogowany |
LPDEST |
nazwa domyślnej drukarki |
OLDPWD |
nazwa poprzedniego bieżącego katalogu |
PATH |
nazwy katalogów z programami (komendami zewnętrznymi) |
PS1 |
wzorzec znaku zachęty |
PWD |
bieżący katalog |
SHELL |
nazwa programu powłoki |
USER |
nazwa użytkownika |
Jaki jest związek między zawartością zmiennej PATH, komendą which i hash -l?
Zaraz po zalogowaniu się wykonać następujące komendy:
$ which ps
$ hash -l
$ ps
$ hash -l
$ df
$ hash -l
$ type ps
Zob. także help hash.
Aliasy są tworzone, żeby dłuższe komendy były dostępne pod krótszymi nazwami.
Wyświetlanie listy aliasów: alias
-bash-4.1$ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mc='. /usr/libexec/mc/mc-wrapper.sh'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
Tworzenie nowego aliasu: alias nazwa=komenda.
W celu upewnienia się, że dana nazwa jest nieużywana i nie odpowiada żadnej komendzie lub
wcześniej zdefiniowanemu aliasowi, można posłużyć się komendą type nazwa.
Aliasy mają charakter tymczasowy, trwają tak długo jak bieżąca sesja. W celu ich utrwalenia trzeba je umieścić w pliku ~/.bashrc (zob. BASH jako język skryptowy).
Globbing to dopasowywanie elementów do podanego wzorca, który zawiera symbole globalne, tj. wieloznaczne. Używany do dopasowywania zbiorów plików w katalogu.
* = dopasowuje zero lub więcej dowolnych znaków
? = dopasowuje dokładnie jeden dowolny znak
[ ] = dopasowuje dokładnie jeden z podanego zbioru znaków.
Np. po przejściu do katalogu /sbin można porównać działanie komend: ld*, lu*, lv*,
l[cuv] i l[!cuv].
Jaki skutek wywołuje zastosowanie komendy: mkdir {a,b.c}.{1,2,3}?
Powłoka rozróżnia duże i małe litery, a pewną grupę znaków traktuje jako znaki specjalne (metaznaki):
$ & ; () {} [] * ? ! <> | " ` '
Do tych znaków zalicza się także spacja, która służy do oddzielania słów komendy. Znaki specjalne mogą się pojawiać np. w nazwach plików, ale muszą być odpowiednio cytowane:
labul@centos7-1 ~]$ touch 'acb def'
labul@centos7-1 ~]$ touch 'acb!def'
labul@centos7-1 ~]$ touch acb\!def
Para cudzysłowów jest używana do pozbawienia niektórych metaznaków ich specjalnego
znaczenia. Porównaj: ls l* i ls "l*", ls l[cd]* i ls "l[cd]"* oraz
echo $PATH i echo "$PATH".
Para apostrofów jest używana do pozbawienia wszystkich metaznaków ich specjalnego
znaczenia. Porównaj: echo $PATH i echo '$PATH'.
Lewy ukośnik, \, jest używany do cytowania jedynie pojedynczego znaku, który
poprzedza. Porównaj: echo $PATH$EDITOR i echo '$PATH\$EDITOR'. Znak ten służy
także do tworzenia komend, które są zapisywane w dwóch lub większej liczbie wierszy.
Listy komend
Znak ; służy do oddzielania komend w ramach jednego wiersza; komendy są wykonywane
jedna po drugiej.
Znak & służy do oddzielania komend w ramach jednego wiersza; komendy są wykonywane
współbieżnie (asynchronicznie, w ramach podpowłoki).
Znak && służy do oddzielenia dwóch lub więcej komend (tzw. lista ‘AND”). Komenda z
prawej strony && zostanie wykonana pod warunkiem, że komenda z lewej strony znaku
zakończyła się sukcesem. Status zakończenia tej listy jest określony przez status
zakończenia ostatniej wykonywanej komendy.
Znak || służy do oddzielenia dwóch lub więcej komend (tzw. lista ‘OR’). Jeśli
komenda z lewej strony znaku || kończy się błędem, to wykonywana jest komenda z
prawej strony. Status zakończenia tej listy jest określony przez status zakończenia
ostatniej wykonywanej komendy.
Typy komend:
komendy wewnętrzne – około 30 komend, które powłoka może wykonywać b.szybko
[labul@centos7-1 ~]$ type cd
cd is a shell builtin
[labul@centos7-1 ~]$ type echo
echo is a shell builtin
[labul@centos7-1 ~]$ type pwd
pwd is a shell builtin
[labul@centos7-1 ~]$ type type
type is a shell builtin
komendy zewnętrzne – powłoka uruchamia zewnętrzny program (tworzony jest nowy proces); te programy muszą się znajdować w katalogach określonych przez zmienną środowiskową PATH
[labul@centos7-1 ~]$ type dir
dir is /usr/bin/dir
[labul@centos7-1 ~]$ type date
date is /usr/bin/date
labul@centos7-1 ~]$ type ls
ls is aliased to `ls --color=auto'
Opis komend wewnętrznych można otrzymać przy pomocy komendy
labul@centos7-1 ~]$ help [echo]
Wykonana komenda lub program zwracają swój status (kod) zakończenia poprzez zmienną $?. W przypadku powłoki bash znaczenie tych kodów jest następujące:
0 |
sukces |
1 |
ogólny błąd |
2 |
nieprawidłowe użycie wbudowanych funkcji |
126 |
komenda nie miała atrybutu wykonywalności |
127 |
komenda nie została znaleziona |
129-165 |
program został zakończony poprzez wysłanie sygnału <kod powrotu>-128 |
Czasami zachodzi konieczność uruchamiania komend w określonym momencie, albo
cyklicznie. Do tego służą komendy at i crontab. Kilka przykładów użycia tych komend
jest na stronie at i crontab.