# Pliki otwarte i wykorzystywane przez usługi, aplikacje, procesy (lsof – list open files)
lsof -n | grep xx
Można w ten sposób podejrzeć jakie pliki konfiguracyjne są wykorzystywane, do jakiego plików logów jest pisane itd itp.
# Biblioteki używane przez daną aplikacje / biblioteki współdzielone
– Podejrzenie, która binarka odpowiada za działanie programu
which nazwa_aplikacji
– Wyświetlenie bibliotek wykorzystywanych przez niego
ldd adres_binarki_zwrocony_z_whicha
Biblioteka bez => (podlinkowanego pliku) korzysta bezpośrednio z kernela
# Wyzerowanie zawartości pliku
>/plik
# tee – łącznik, który wyrzuca dane jednocześnie na ekran i do pliku
date | tee /tmp/plik
powyższe wyświetli nam jednocześnie bieżącą datę na ekran i dopisze do wskazanego pliku
### Debugowanie cronów ###
# Logi
/var/log/syslog -> cron
# Zapisanie wyjścia z polecenia do pliku
* * * * * skrypt >/plik_z_logiem 2>&1
2>&1 – errory wyrzuć do miejsca które wskazuje &1
1 – strumień outputu
2 – strumień błędów
# Nakładanie się zadań w cronie
Jeżeli odpalona jest poprzednia instancja skryptu nie ma sensu jeszcze raz uruchamiać tego samego. W takim razie trzeba poczekać aż pierwszy się zakończy dopiero odpalić drugi. W tym celu można zastosować mechanizm blokujący:
flock /tmp/jakis_plik_lock komenda/skrypt
flock /tmp/leci_backup /root/skrypty/backupuj_system.sh
-w (jak długo czekać / optymalne)
0 – nieskończoność (defaultowa opcja, więc nie ma sensu dorzucać przełącznika)
x – sekund
Jak długo czekać określa ile czasu czeka drugie zadanie. Jeżeli damy 0 będzie czekał, aż tamten skończy, ale jeżeli damy mniejszą wartość niż czas trwania poprzedniej instancji to po prostu się wycofa i odpuści.
# Debugowanie skryptu bashowego
shellcheck – narzędzie sprawdzające poprawność skryptu
shellcheck skrypt.sh
# Zabezpieczenie skryptu przed wywołaniem niezdefiniowanych zmiennych
$? – kod wyjścia ostatniej komendy
0 – spoko
1 – błąd
Na początku skryptu po powłoce dajemy:
set -u
W sytuacji, gdy spróbujemy wywołać niezdefiniowaną zmienną skrypt zakończy swoje działanie.
set -ue
Powyższe sprawdzi nam exitcode polecenia. Jeżeli któreś z poleceń zakończyło się błędem wówczas to sprawdzi i zakończy działanie całego skryptu. No bo i tak po drodze coś poszło nie tak. Wywala już przy pierwszym możliwym błędzie.
set -o pipefail
Zwróci kod błędu przedostatniej komendy – tej przed pipelinem.
Można złączyć wszystkie razem:
set -ueo pipefail
Założenie pułapki debugującej:
set -x (debugowanie każdej wykonywanej linijki)
trap read debug
Jeżeli skrypt czyta kolejne linie z pliku to uruchamia się debug. Czyta po kolei linie i czeka na potwierdzenie przez usera enterem. Mamy wówczas pewność co się dzieje po kolei w skrypcie.
# Instalowanie pakietów ze źródeł
1. Pobieramy paczkę
* czytamy plik README (w nim szukamy instrukcji instalacji)
2. Szukamy w niej pliku configure
3. Jeżeli nie ma szukamy pliku autogen.sh
4. Jeżeli go znajdziemy to uruchamiamy autogena, on wygeneruje configure. Jeżeli wywali błąd wówczas doinstalowujemy to czego mu brakuje.
5. Jeżeli skończy uruchamiamy configure (./configure)
* możemy dać ./configure –prefix=/usr/ wówczas z automatu zaktualizuje do najnowszej wersji program
6. Ewentualne braki doinstalowujemy
* w przypadku modułów szukamy apt search nazwa_modułu i instalujemy paczkę libnazwamodulu-dev
* po zainstalowaniu deva uruchamiamy jeszcze raz autogena
7. make
8. make install
ogólnie czytać komunikaty, głównie są to brakujące pakiety które trzeba wyszukiwać i instalować
# Wyczyszczenie historii poleceń w shellu
history -c
# Ls połączone z grepem
ls | grep nazwa <==> ls *nazwa*
# Problemy z połączeniem przez ssh
logi połączeń: /var/log/auth.log
/etc/shadow jest to plik przechowujący hasła userów, jeżeli przed hasłem stoi ! to znak, że konto zostało zablokowane
# Klucze ssh
Przechowywane są w pliku ~/.ssh/authorized_keys
Weryfikacja kluczy w powyższym pliku:
ssh-keygen -lf ~/.ssh/authorized_keys
Jeżeli będzie literówka w tym kluczy wówczas nie zwróci ta komenda go.
# Uruchomienie polecenia w tle
screen – tworzy nowy screen (terminal)
– polecenie uruchamia się w terminalu, a nie w sesji SSH
Ctrl+a+d – powrót do sesji ssh
screen -ls – podejrzenie działających screenów
screen -r numer_sesji – podłączenie do danego screena
screen -S nazwa_sesji – nadanie screenowi nazwy, łatwej do odwoływania
exit – zabicie screena (wywołane wewnątrz)
# Sklonowanie układu partycji na dysku
– Wyświetlenie partycji
fdisk -l
– Utworzenie partycji z narzędziem cfdisk (cfisk to interaktywne narzędzie do zarządzania dyskami)
cfdisk /dev/sdx -> gpt -> interaktywnie
mkfs.ext4 /dev/sdxy
* Każdy dysk może mieć tylko 4 partycje główne, jeżeli potrzebujemy więcej wówczas robimy je jako rozszerzone.
Partycja rozszerzona to taki kontener na partycji. Tworzymy jedną rozszerzoną i w niej kolejne „podpartycje”.
– Utworzenie układu partycji na jednym dysku i zrzucenie tego układu 1:1 na drugi dysk
sfdisk /dev/sdx -d | sfdisk /dev/sdy
Po tym należy tylko poformatować odpowiednio partycje, ale układ na obu dyskach będzie taki sam (ilość, rozmiar, sektory startowe)
# xargs
Jest to narzędzie, które pobiera dane wejściowe z poprzedniego polecania i wykorzystuje je jako argumenty dla nowego polecenia
jakaś_komenda | xargs touch
utworzy to pliki o nazwie zwracanej przez jakąś_komende
seq 1 1000 | xargs touch
ls -U | xargs rm
– Placeholders, prefixy
-I {} – wrzuć do placeholdera to co otrzymujesz na wejściu
seq 1 1000 | xargs -I {} touch prefix_{}
– W tej sytuacji jednak każdy xargs to jeden wątek. Możemy zmusić, aby wykonywał kilka wątków jednocześnie
seq 1 1000 | xargs -P 20 -I {} touch prefix_{}
# sync
Jest to narzędzie, które zrzuca bufor na trwały nośnik. W ten sposób możemy upewnić się, że wszystkie dane zostaną zapisane na dysku.
Uruchamiamy je bez przełączników.
# Sprawdzenie typu pliku
Mamy plik bez rozszerzenie i chcielibyśmy się dowiedzieć co to za plik. Służy do tego polecenie file, które wyświetli nam nagłówki tego pliku:
file nazwa_pliku
# Podmontowanie pliku jako urządzenie blokowe
Jeżeli mamy np obraz dysku w pliku, a chcemy na nim pracować musimy utworzyć virtualne urządzenie blokowego, do którego zostanie to zmapowane. Następnie to urządzenie będziemy mogli normalnie podmontować. Znajdzie ono wolne urządzenie loop i zmapuje tam partycje. Wyświetli również informacje, do którego loopbacka go zmapował. Jeżeli było kilka partycji będą pod: /dev/loopxpy. X to numer loopbacku, który zwroci komenda, y to kolejne numery partycji.
losetup -f -P –show nazwa_pliku
# Atrybuty plików
– Uzyskanie atrybutów pliku:
lsattr plik
a – append only, tylko można dopisać coś na koniec, nie można edytować, ani zmieniać uprawnień
i – immutable, możemy tylko wyświetlić jego zawartość, nie można edytować i kasować
– Dodawanie atrybutów do pliku:
chattr +x plik
– Kasowanie atrybutu:
chattr -x plik
# Zmierzenie czasu trwania komendy
time komenda
time ls
# Wyświetlenie sekwencji liczby
seq poczatek koniec
seq -w poczatek koniec <- stała długość, czyli np jeżeli bierzemy liczmy z przedziału 1-100 to wszystkie będą 3-cyfrowej, zapisane: 001, 002
# Praca z dużą ilością plików
ls -lU
U – unsorted, nie sortuj ich, dzięki temu zyskamy na czasie
– Usuń wszystkie zaczynające się od wzorca
ls -U | grep ^znak | xargs rm
wylistuj niesortowane | znajdź wszystkie zaczynające się od znaku | przechwyć wynik szukania i skasuj to
# Dostęp do serwera bez hasła root
Podczas ponownego uruchamiania maszyny edytujemy startowy wpis w GRUBie (podczas startu warto trzymać Shift, gdyż nie zawsze GRUB się pojawia). Szukamy tam linii Linux i zamieniamy ro na rw i dopisujemy init=/bin/sh. A następnie klikamy F10 aby wystartować. W tej sposób uzyskaliśmy dostęp do shella z uprawnieniami roota. Teraz wystarczy wywołać polecenie passwd i ustawić nowe hasło na roota. Na koniec rebootujemy system poleceniem: echo b >/proc/sysrq-trigger.
# Utworzenie tunelu SSH
Gdy mamy usługę, która nie jest wystawiona do internetu, ale chcemy z niej skorzystać z innego hosta możemy utworzyć tunel SSH na ten konkretny port:
ssh -L port_na_ktorym_sluchamy_lokalnie:IP_na_jakim_jest_usluga:port_na_jakim_jest_usluga user@IP/HOSTNAME
W ten sposób, gdy np mamy serwer WWW i chcemy aby lokalnie był dostępny na porcie 8080 polecenie będzie wyglądało:
ssh -L 8080:ip:80 root@IP
# Czat terminalowy
– Utworzenie serwera
nc -l numer_portu
– Podłączenie do serwera
nc IP_serwera port_na_jakim_nasluchuje
– Przesłanie pliku przez netcat
serwer: nc -l port > plik
klient: cat plik > nc -q1 IP port
q1 – po wysłaniu odczekaj 1 sekundę i zamknij połączenie
# Nazwany strumień danych – rura
Jest to przestrzeń danych, rura, do której wrzucamy dane i odczytujemy je. Dane te są zbierane w rurze do momentu, aż gdzieś podepniemy jej wyjście.
– Utworzenie
mknod rura p
mknod tworzy nowe urządzenie
rura – nazwa strumienia, dowolna
p – typ urządzenia, pipe
– Wykorzystanie na przykładzie nc
nc -l 1234 <rura | nc wp.pl 80 >rura
Otwórz mi port nasłuchujący, do którego spływa wszystko z rury | Połącz mnie do wp i wszystko co dostajesz w odpowiedzi wrzucaj do rury
W ten sposób spięliśmy te dwa netcaty „loopbackiem”.
Rurę możemy podpiąć w kilku miejscach jednocześnie. Po strażacku: rura to wąż tłoczny, możemy go podpiąć od hydrantu do prądownicy, albo przed prądownicą założyć rozdzielać dzięki temu możemy podpiąć do niego kilka prądownic.
# Grep przełączniki
-v „tej_frazy_nie_wyswietlaj”
-r – rekursywnie, we wszystkich podkatalog
-i – nie zwracaj uwagi na wielkość liter
-l – wyświetl tylko nazwę pliku gdzie znalazłeś
# Wyświetl wynik jako kolumny
column -t
przydatne np. przy mount
# Zbieranie informacji o serwerze
– Sprawdzenie wersji kernela i architektury
uname -a
– Sprawdzenie wersji systemu
lsb_release -a
– FQDN i IP
hostname -i (ip)
hostname -f (fqdn)
– Przejrzenie usług działających
pstree
– Sprawdzenie cronów
crontab -l
ls /var/spool/cron/crontabs
ls /etc/cron*
– Sprawdzenie UUID dysków
blkid
– Partycje na dysku
fdisk -l
– Info o procesorze
lscpu
cat /proc/cpuinfo
* Tutaj warto wspomnieć, że wiele poleceń to jest po prostu cat pliku z katalogu /proc, jak np w powyższym przypadku lscpu wyświetla zawartość pliku /proc/cpuinfo
– Info o RAIDach
cat /proc/mdstat
– Usługi startujące przy starcie
systemctl –all list-unit-files –type=service
service –status-all
initctl list
cat /etc/rc.local
ls /etc/rc*.d/
* – levele systemu (runlevel – aktualny level)
– Wyświetlenie info o LVM
lvs
vgs
pvs
– Statystyki o wykonywanych poleceniach (historii)
history -w /dev/stdout | sort | uniq -c | sort -nr | head
history -w plik – zapisz komendy do pliku
sort – posortuj to
uniq -c – wyciągnij unikaty i policz je
sort -nr – posortuj po numerkach i reverse
– Wyświetl info o hardwarze
lshw
lspci
# Backupowanie zapchanego dysku na inny serwer
tar zcvf – / | ssh root@IP 'cat >/dysk.tgz’
z – tgz
c – create
v – verbose
f – to file
– – rzuć spakowane dane na ekran
cat bierze też input, nie robi nic i wyrzuca na output
– Podejrzenie archiwum
tar -ztf plik.tgz
z – tgz
t- test
f- file
# Sprawdzenie lokalizacji komendy
type komenda
Wyświetli nam to lokalizację binarki, ewentualnie informacje jakim aliasem jest.
# Wyświetlenie aliasów
alias
# Skasowanie aliasu
unalias komenda