Rejestrowanie się w systemie i powłoka

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:

  1. czytaj komendy z terminala lub pliku

  2. sprawdź poprawność komendy

  3. wykonaj komendę, albo uruchom wskazany program

  4. wypisz wyniki na ekran (do pliku)

  5. 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.