Terminal - podstawowe komendy i koncepty
Szukanie pomocy
Sprawdzanie co jest czym oraz do czego służy
- man - manual
- apropos - wyszukujemy nim słów kluczowych (np w opisach programów etc)
- whatis -
- file - opisuje typ pliku
Wyrażenia regularne
Pliki
Uprawnienia plików
Każdy plik w linuxie ma swoje uprawnienia, które są podzielone na trzy grupy:
- właściciel
u - grupa
g - inni
o
Każda z tych grup ma swoje uprawnienia do pliku, które są podzielone na:
- odczyt
r - zapis
w - wykonanie
x
Poza tym są też specjalne uprawnienia:
s- setuid (gdy dla właściciela), setgid (gdy dla grupy), sticky bit - jest to flaga, która może mieć różne efekty w zależności od tego, czy jest ustawiona na piku, czy nafolderze. przykład- na pliku wykonywalnym - jeśli jest ustawiona to plik będzie wykonywany z uprawnieniami właściciela pliku, a nie osoby, która go uruchomiła. Tzn może być używana do uruchamiania aplikacji z uprawnieniami roota, nawet jeśli się nim nie jest.
- na folderze - jeśli setgid jest ustawiony na folderze, to każdy plik stworzony w tym folderze będzie miał grupę ustawioną na grupę folderu, a nie grupę użytkownika, który go stworzył.
Przykładowe
Wartość 0770 wszyscy w grupie mogą dodawać, usuwać i czytać sobie nawzajem pliki w folderze, ale nie mogą sobie nawzajemi pisać.
sudo chmod 0770 folder
Wartość 1770 daje takie uprawnienia jak wyżej z tą różnicą, że tylko właściciel pliku może go usunąć.
sudo chmod 1770 folder
Wartość 2770 oznacza, że wszyscy użytkownicy grupy mogą dodawać, czytać, zadpisywać i usuwać sobie nawzajem pliki w folderze.
Wartość 3770 oznacza to samo co wyżej z tą różnicą, że tylko właściciel może usuwać pliki.
pierwsza cyfra jest wynikiem sumowania sticky bit + 2 * setgid
ls -l
#-rw-r--r-- 1 user privileged_users 0 Oct 9 12:00 plik.txt
Pierwszy znak to typ pliku, a kolejne trzy grupy to uprawnienia dla właściciela, grupy i innych.
Czyli przykładowy ciąg -rw-r--r-- można rozpisać na
- pierwszy bit jako
-(plik zwykły) (może być teżddla folderów) - właściciela jako
rw- - grupę jako
r-- - i innych jako
r--.
Można to także przedstawić w formacie zapisu liczbowego, gdzie każda grupa ma swoją wartość: r=4, w=2, x=1.
#-rw-r--r--
# 110 100 100
# 6 4 4
Ten zapis może być wykorzystywany chociażby przez komendę chmod, która przyjmuje różne waroanty argumentów link.
chmod 777 plik.txt #nadanie pełnych uprawnień wszystkim
chmod 755 plik.txt #nadanie pełnych uprawnień właścicielowi, a grupie i innym tylko odczytu i wykonania
# zapis zmieniający uprawnienia
chmod u+x plik.txt #dodanie uprawnień do wykonania dla właściciela
chmod u-x plik.txt #usunięcie uprawnień do wykonania dla właściciela
chmod g+rw plik.txt #dodanie uprawnień do odczytu i zapisu dla grupy
Szukanie plików
find -name a*n.java
Rozmiary folderów
domyślne ls ni pokauje rozmiarów folderów. Do tego należy użyć komandy du
du -s /home/ja
Przydatne flagi:
-s-pokaż tylko wybrany folder bez podfolderóœ-h- human readable, zaokrągla do GB, MB etc.--max-depth=2- maksymalna głębokość przy pokazywaniu podfolderów
Alternatywnie do badania struktury katalogów można użyć tree
tree --du -h -d
Flagi:
-d- wyświetl tylko foldery--du- podlicz rozmiary folderów-hpodawaj rozmiary w czytelnym formacie
Pisanie do plików
Każda aplikacja ma wejście (stdin) oraz dwa wyjścia (stdout-zwykłe i stderr-dla błędów)
Z pomocą poniższych komend możemy przekierowywać wyjścia programów do urządzeń lub plików
| Komenda | Działanie |
|---|---|
< |
deviceredirects stdin to the device |
>> |
deviceredirects stdout to the device (appends to the end) |
> device |
redirects stdout to the device (overwrites previous content) |
2> device |
redirects stderr to the device (overwrites previous content) |
2>&1 |
redirects stderr to the device associated to stdout |
cat logi.log | grep "10-10-2022" > logs_from_10-10-2022.log
Obróbka tekstu
Wyszukiwanie wzorca
cat PLIKI | grep wyszukiwane_slowo
grep -r . #przeszukanie wszystkich plików (nawet binarnych) w danym folderze
strings służy do wypisywania stringów z plików binarnych (dobrze współdziała z grep)
strings PLIK
Inne przydatne flagi grepa
-v --invert-match |
odwrócony grep, przekazuje tylko to, co nie pasuje |
-B, --before-context=ILE |
Wypisz ILE linii po przed znaleziskiem wyświetlić |
-A, --after-context=ILE |
Wypisz ILE linii po znalezisku wyświetlić |
Dzielenie dłuższych łańcuchów znaków
cut - proste wycinanie fragmentów tekstu
-bbyte - wydziela poszczególne bajty
echo "abcdefgh" | cut -b 1,3,5-6
# acef
echo "qwer tyui xxx" | cut -d " " -f 2 #-d delimiter (separator) -f pole
#tyui
-f przyjmuje liczby w następujących formatach: N, N-M, -M, N-, X,Y,Z
head - służy do pokazywania tylko wybranych linii.
cat ./dlugi_plik.log | head -n 100 #drukuje tylko 100 pierwszych linii
W wypadku, gdy chcemy wydzielić samą nazwę pliku ze ścieżki warto użyć komendy basename
basename /sciezka/do/pliku/plik.txt
# plik.txt
Manipulacja tekstem
sed służy do nieco bardziej zaawansowanych manipulacji
echo "abcdefbc" | sed "s/bc/BC/" # zamień pierwszy pasujący ciąg (bc) na BC
#aBCdefbc
TODO
Zmienne
Zmienną tworzymy za pomocą znaku =, który przypisuje wartość do dane identyfikatora. identyfikator=wartość.
Aby uzyskać dostęp do zawartości używamy $ przed nazwą zmiennej.
$ msg=”Hello World”
$ echo $msg
Hello World
Wstawianie zmiennych w tekst
Jest kilka sposobów, aby mieć w sktyptach tekst, który jest zależny od sytuacji. Możemy do tego wykorzystywać:
- Zmienne
/my/path/to/${EDITED_FILE} -
Wyniki funkcji ` dsd
Argumenty
Każda funkcja, czy też skrypt bashowy może mieć przekazywane poprzez proste podanie ich po wywołaniu.
Dla skryptu:
#!/bin/bash
wyprintuj_argument()
{
#tutaj odwołujemy się do pierwszego argumentu przekazanego do funkcji
#a nie do skryptu
echo "argument $1"
}
wyprintuj_argument $1
wyprintuj_argument $2
przy wywołaniu ./skr.sh Hello 222
Otrzymamy
argument Hello
argument 222
Zwroty przydatne przy obsłudze argumentów
| $0 | Nazwa wołanej komendy/skryptu |
| $1 $2 $3 | poszczególne argumenty (pierwszy, drugi, trzeci) |
| $# | Liczba argumentów |
| $* | Wszystkie argumenty jako jeden string |
| $@ | Wszystkie argumenty jako lista |
xargs
Jeśli chcemy wykorzystywać wyjścia mechanizm strumieni do przekazywania argumentów to możemy użyć także komendy xargs
#Wywołanie komendy rm dla każdego znalezionego pliku
find /path -type f -print | xargs rm
Flagi:
-n- maksymalna liczba argumentów-d,--delimiter- podział na części (komenda zostanie wywołana wielokrotnie)
echo -n 123-456-7890 | xargs echo
#> 123-456-7890
echo -n "123-456-789" | xargs -n 1 -d - echo
#> 123
#> 456
#> 789
-I,-i,--replace=pozwala na elastyczne wstawianie otrzymanego argumentu
#Stworzy pliki 123.txt 456.txt 789.txt
echo -n "123-456-789" | xargs -d - -n 1 -I{} echo {}.txt
Procesy
Łączniki:
&&-wykonaj kolejny proces, jeśli poprzedni się powiedzie (retcode 0)||- wykonaj następny, gdy poprzedni to porażka&- proces jest utuchamiany w tle (jego pid można zdobyć za pomocą$!)
TODO więcej
Warunki
Warunki sprawdza się za pomocą komendy test z odpowiednimi flagami.
Można to także robić za pomocą wmieszczając warunek w nawiasach [].
Możliwy jest też wariant z dwoma nawiasami [[ cośtam ]] jest on wspierany przez wszystkie nowsze systemy używające Basha, ale mimo wszystko może byc on niekompatybilny ze starszymi.
Warto pamiętać, że bardzo ważne tu są spacje i aby o nich nie zapomnieć.
Samo test jako komenda nie robi nic po prostu sprawdza warunek i zależnie od niego zwraca jakiś kod.
[ 1 -gt 100 ]
echo "Ret: $?" #zwraca kod ostatnio działającej aplikacji
# Ret: 1
[ 100 -gt 1 ]
echo "Ret: $?"
# Ret: 0
| Operator | Description |
|---|---|
| ! EXPRESSION | The EXPRESSION is false. |
| -n STRING | The length of STRING is greater than zero. |
| -z STRING | The lengh of STRING is zero (ie it is empty). |
| STRING1 = STRING2 | STRING1 is equal to STRING2 |
| STRING1 != STRING2 | STRING1 is not equal to STRING2 |
| INTEGER1 -eq INTEGER2 | INTEGER1 is numerically equal to INTEGER2 |
| INTEGER1 -gt INTEGER2 | INTEGER1 is numerically greater than INTEGER2 |
| INTEGER1 -lt INTEGER2 | INTEGER1 is numerically less than INTEGER2 |
| -d FILE | FILE exists and is a directory. |
| -e FILE | FILE exists. |
| -r FILE | FILE exists and the read permission is granted. |
| -s FILE | FILE exists and it's size is greater than zero (ie. it is not empty). |
| -w FILE | FILE exists and the write permission is granted. |
| -x FILE | FILE exists and the execute permission is granted. |
Dopiero po połączeniu z wyrażeniami warunkowymi się przydaje.
Uwagi
=oraz-eqdziałają inaczej np01 = 1da fałsz, ale01 -eq 1da prawdę
Warunki if
#nie musi tu być koniecznie test, może to być dowolna. Jeśli zwraca ona 0 to mamy sukces i wchodzimy do środka
if apka_zwracająca_jakiś_kod
then
komendy
fi
#wariant z else
if apka_zwracająca_jakiś_kod
then
komendy
else
inne komendy
fi
Pętle
for - iteruje po liście
for variable in valuelist
do
something
done
Listą mogą być argumenty programu
#!/bin/bash
echo The number of arguments is: $#
echo The entered command line is: $0 $@
echo The command arguments are:
for i in "$@"
do
echo $i
done
... albo pliki w folderze
for k in *
do
cp $k $k.bak
echo $k copy created
done
lub wynik komendy (używamy do tego $())
for i in $(ls)
do
echo $i
done
//TODO opis skrótów klawiszowych Ctrl-C Ctrl-D etc // https://www.howtogeek.com/howto/ubuntu/keyboard-shortcuts-for-bash-command-shell-for-ubuntu-debian-suse-redhat-linux-etc/