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.