LINUX


UWAGA!!! Operacje opisane w tym dokumencie uzyte w praktyce moga spowodowac wiele nieoczekiwanych efektow (utrate danych, uszkodzenie sprzetu, utrate zdrowia, ...). Autor tego tekstu nie bierze odpowiedzialnosci za efekty przeprowadzenia opisanych tutaj operacji.

Moje miniskrypty
(no wiem, ze dla linux-guru ten zestaw jest banalny zeby nie powiedziec glupi
ale dla mnie stanowia podreczny przypomiacz):

  • Jak przeszukac dysk i znalezc pliki MP3 a nastepnie kazdy odtworzyc przy uzyciu MPG123:
      find -name "*.mp3" | mpg123 -@ -
    
  • Jak przeszukac dysk i znalezc pliki bedace opisem serwisow w systemd:
      find  / 2>/dev/null -type f -regextype sed -regex ".*\.service$"
    
    Samo "-regex" nie wiele daje bez "-regextype sed" gdyz wtedy zaczyna traktowac argument regex jak domyslne w linux (stad parametr 'sed').

  • Jak skopiowac z drzewa katalogow same pliki okreslonego typu (tu z rozszerzeniem 'mp3') zachowujac ich strukture katalogowa:
      rsync -auzv --include '*/' --include '*.mp3' --exclude '*' /home/user/media/ /home/user/wsad_dla_mp3_playera/
    
  • Jak wypisac wszystkie pliki (i tylko pliki) w aktualny katalogu i jego podkatalogach:
      for i in $(find . -type f); do echo $i; done
    
  • Jak wypisac wielkosc podkatalogow w bardzo zwartej formie,
    uzyteczne gdy chcemy wiedziec ile uzytkownicy zajmuja na swoim dysku (np.: cd /home):
      for i in $(ls); do du -sh $i; done
    
    Ale jezeli w nazwach katalogow sa spacje (co obecnie dzieki niektorym programom jest juz niemal narma) uzyj:
      for i in $(find . -maxdepth 1 -type d); do du -sh "$i"; done | sort -h
    
    UWAGA! Starsze wersje 'sort' moga nie wspierac opcji '-h', wtedy uzyj mniej przyjemnego w czytaniu wywolania
      for i in $(find . -maxdepth 1 -type d); do du -s "$i"; done | sort -n
    
    Ktore pokazuje kolejnosc i wielosc w magicznych jednostkach.
  • Jak wypisac wielkosc wybranych podkatalogow w bardzo zwartej formie:
      for i in $(echo "bin etc lib opt sys usr boot dev sbin tmp var"); do du -sh $i; done
    
  • Jak liczby od 1000 do 1100 z krokiem 1 (przydatne gdy musisz wygenerowac duza liste wartosci a nie chce sie tego pisac recznie a do tego nie jest to trywialna wyliczanka do wygenrowania za pomoca 'seq'):
     for i in `seq 1000 1100`; do echo "liczba: "$i; done
    
  • Jak policzyc sumy kontrolne dla plikow w danym poddrzewie
    (aby mozliwe bylo obserwowanie czy cos sie zmienilo w drzewie):
    for i in $(find . -type f); do md5sum  $i; done 
    
    Efektem bedzie, np.:
    6f06eb1376bcbc009313d4507a2f4def  ./S45dhcp
    fa043f7a9c09d5c40bd3e387b2941698  ./S46http
    60bad4d8089eabf0cc37a0d6b845ad90  ./main.c
    7bb03eda23fc1bf0033ed95b322e0ec4  ./Nowa_paczka/opis.txt
    2884f07d754d6c26eb1117a4df65e3cf  ./Nowa_paczka/arch/opis.txt
    efe023b9ff4f22dc4236da746df2a80f  ./test_i386
    
    Sledzac (w tej wersji "recznie") cyfry z lewej strony mozna
    wywnioskowac czy jakis plik sie zmienil.
    
  • Jak wylaczyc szereg RaPi znajac liste ich IP (tu: 192.168.88.7, 192.168.88.161, 192.168.88.201):
    for i in $(echo "192.168.88.7" "192.168.88.161" "192.168.88.201"); do ssh pi@$i "sudo shutdown -h now" ; done
    
    Wada tego podejscia jest iz pyta dwa razy o haslo - raz do maszyny po ssh a raz do sudo, mozna to minac: pierwszy - instalujac klucz SSH - co polecam zawsze (po co pisac haslo ssh-agent da podobny poziom zabezpieczen), drugi dopisujac usera PI do listy userow ktorzy moga wykonac polecenie bez hasla (visudo) - czego jednak nie polecam.
  • Jak wygenerowac ciga liczb zapisanych w formacie HEX o identycznej szerokosci:
    seq 1 1023 | xargs printf '0x%04x\n'
    
  • Jak sprawdzić czy plik na lokalnym kompie jest identyczny z tym umieszczonym na zdalnej maszynie (i nie sprawdzać ręcznie literka po literce w skrótach):
    1.Komp lokalny:
    >md5sum moj_super_wazny_plik.pdf
    
    wygeneruje skrót np.:
    43aaecf0c18ecc549b678f01b003a48b *moj_super_wazny_plik.pdf
    
    2.Komputer zdalny (kopiujesz do echo "" wynik z komp'a lokalnego):
    >echo "43aaecf0c18ecc549b678f01b003a48b *moj_super_wazny_plik.pdf" | md5sum -c -
    
    jeżeli ok - wygeneruje napis:
    moj_super_wazny_plik.pdf: OK
    
    jeżeli zawartości nie sa identyczne co do sktórtów - wygenruje napis:
    moj_super_wazny_plik.pdf: FAILED
    md5sum: WARNING: 1 of 1 computed checksum did NOT match
    
  • Gdy stosujesz sume wyliczona via sha256sum - testuj uruchamiajac:
    echo "c5dad159a2775c687e9281b1a0e586f7471690ae28f2f2282c90e7d59f64273c 2021-05-07-raspios-buster-armhf-lite.zip" | sha256sum -c
    
  • Jak zakodowac w python z uzyciem Base64 (czyli aby nie zostawic czegos jawnym tekstem):
    import base64
    "ala ma kota".encode('base64')
    
    interpreter zwroci: 'YWxhIG1hIGtvdGE=\n', a jak zdekodowac:
    import base64
    'YWxhIG1hIGtvdGE=\n'.decode('base64')
    
    i teraz interpreter zwroci: 'ala ma kota'

  • Jak ustawic czas w systemie (gdy nie mamy: ntpd/ntpdate):
    date -s '2014-09-19 14:59'
    
  • Jak dowiedziec sie ile sekund minelo od 1 stycznia 1970:
    date +"%s"
    
  • Jak dowiedziec sie ktora godzina bedzie gdy do obecnego czasu dodamy 1800sek (czyli za 1/2h) - wierz mi czasami sie to przydaje gdy system logowania podaje wartosci w dziwnym formacie:
    date +"%s" | xargs -i echo "{}+1800" | bc | xargs -i date --date='@{}'
    
    Oczywiscie pierwsza czesc jest dla testów ale od pierwszego xargs zaczyna sie cale operawanie na liczba skeund i ich konwersja do czytelnego foirmatu.
  • Jak odczytac w Linux z srodowiskiem busybox date w zadanym przez nas foramcie:
     date -u "+%s_%Y-%m-%d_%H:%M:%S"
    

    Jakies roznosci z poleceniem 'find':
  • A moze zrobic liczenie powyzsze nieco prosciej?:
    find . -type f | xargs -i  md5sum {}
    
    Lub w postaci sktyptu:
    #!/bin/sh
    echo "Polcze md5sum dla wszystkich plikow w katalogu '$1'"
    find $1 -type f | xargs -i  md5sum {}
    
  • A moze zrobic liczenie nieco bardziej zawile?:
    find . -type f | xargs -0 echo | awk '{ print "/home/user" $0 ""}' | xargs -i md5sum {}
    
  • A moze sprobowac kopiowania plikow z danego poddrzewa do jednego katalogu:
    find . -name "*.exe" -type f -print | xargs -i cp -a {} /home/nowa_lokacja
    
  • A moze sprobowac odtworzyc z miejsca "./" strukture katalogow, a potem skopiowac tylko pliki o danej nazwie:
    find . -name "*.doc" -printf "%h\n" | sort -u | xargs -i mkdir -p /home/nowe_miejsce/{}
    find . -name "*.doc" -type f | sort -u | xargs -i cp {} /home/nowe_miejsce/{}
    
  • A moze chcesz wypisac na raz pliki o dwoch typach nazw (doc i txt):
     find . \( -name "*.doc" -or -name "*.txt" \) -type f
    
  • Jak wypisac nazwy podkatalogow w aktualnym katalogu (wazne gdy nie chcemy mieszac podkatalogow i plikow):
     find . -maxdepth 1 -type d 
    
  • Jak wypisac wielkosc podkatalogow w glownym drzewie:
     find / -maxdepth 1 -type d | xargs -n 1 du -sh
    
  • Jak wypisac wielkosc kont zajmowanych przez userow (czyli badamy katalog /home, uwaga! busybox nie posiada 'mindepth'):
     find /home/ -maxdepth 1 -mindepth 1 -type d  | xargs -n 1 du -sh
    
  • Jak wypisac posortowana wielkosc podkatalogow w glownym drzewie (uwaga! sortowane sa podane przez 'du' wielkosci maksymalnie 10 znakowe):
     find . -maxdepth 1  -type d | xargs -n 1 du -sb  | sort -n --key=1,10
    
  • Jak wypisac pliki ktorch wlascicielem jest 'user_name', uwaga! nie pomyl znakow " ' `:
     find . -user `cat /etc/passwd | grep 'user_name' | cut -f3 -d":"`
    
  • Jak wypisac nazwy plikow w podkatalogach, tak aby ich Sambowe odwzorowania byly zrozumiale przez win'de (zaklada sie ze udzial zamontowano jako 'Z:', oraz miejsce gdzi robisz ponizsza operacje to Z:\cos\gdzies\:
     find . -type f | tr "/" "\\" | sed -e 's/^./Z:\\cos\\gdzies/'
    
  • A jak mozna znalezc wszystkie pliki w glownym systemie plikow np.: typu *.zip (stare zipy z MSDOSa):
      find / | perl -e 'while(<>){next if not /^*\.zip\n/;print;}'
    
    lub wypisac zawartosci tych plikow (zipow):
      find / | perl -e 'while(<>){next if not /^*\.zip\n/;print;}' | xargs -n 1 zipinfo -1 
     
      Uwaga!!! xargs -n 1 uruchamia zipinfo -1 z argumentem 
               bedacym jedna linia stdin xargs'a
    
      Jezeli Twoj Linux nie ma 'zipinfo' uzyj 'unzip -Z' tutaj 'unzip -Z -1' 
    
    
      Inna wersja (wypisuje zipinfo z czym jest uruchamiane):
    
      find / | perl -e 'while(<>){next if not /^*\.zip\n/;print;}' | xargs -i -t zipinfo -1 {}
    
      Na stderr wypisuje jakie pliki poddano zipinfo
    
  • Jak wypisac elementy zapisane na dysku
    z podawaniem tylko nazw plikow         z podawaniem tylko nazw katalogow
         find / -type f
       
     
         find / -type d
       
  • Jak wypisac pliki od glownego katalogu, ale tylko takie ktore maja prawa uruchamiania:
     find / -type f -perm /+x 
    
  • Jak wypisac wielkosc pamieci w komputerze
    awk '/MemTotal:/ {print($2)}' /proc/meminfo
    
  • I podobne ale jak wypisac liczbe bedaca polowa pamieci w komputerze
    awk '/MemTotal:/ {print($2/2)}' /proc/meminfo
    
  • A moze brak tobie mozliwosci C ale z lini polece za pomoca find?
     find . -type d -fprintf /home/user/nazwa_plik 'du -sh %f\n'
    
    Po takim poleceniu wypisana zostanie wypisana seria polecen, liczacych wielkosc plikow
    A moze chcesz sobie uproscic i wypisac wynik na aktualnej konsoli:
     find . -type d -fprintf `tty` 'du -sh %f\n'
    
  • Nie radzisz sobie z spacjami w nazwach plików op rozszerzeniu .mp4 i chcesz jednak wypisac ich dlugosci:
     find . -type f -name "*.mp4" -print0 | xargs -i -0 du -sh {}
    
     find . -type f -name "*.mp4" -print0 | xargs -0 -I '{}' /home/apruszko/mp4_to_mp3.sh '{}'
    

  • Jak wypisac plik (np.: wynik pracy preprocesora) tak aby nie zawieral pustych lini:
    (Ten problem mozna jakos rozwiazac przypomocy grepa ale tu nie oto chodzi, bo nasze linie moga zawierac biale spacje!)
      cat plik_wejsciowy | perl -e 'while(<>){next if /^\s*\n/; print;}' 
    
  • Podobnie gdy nie chcemy czytac lini komentowanych znakiem '#':
      cat plik_wejsciowy | perl -e 'while(<>){next if /^\s*#/; print;}' 
    
  • Jak przeszukac w danym podkatalogu wszystkie pliki pod katem wystepowania slowa:
      grep -lr "szukana fraza" path/*
    
      gdzie: 
      szukana fraza - czego szukamy - mozemy uzywac wyrazen regularnych
      path          - miejsce przeszukiwania 
    
  • Czasami jednka chcemy znalezc w jakim pliku z calego zestawu plików o tej samej nazwie (np.: pliki makefile lub Makefile) jest zapisana szukana tresc (np: objdump):
  • find . -type f -iname 'makefile' -exec grep -niH 'objdump' {} \; -print
    
    Uwaga! Mozna tez tak ale efekt jest nieco inny - wypisane sa nazwy plików z numerem wystapienia i fragmentem:
    find . -type f -iname 'makefile' -exec grep -niH 'objdump' {} \;
    

  • Jak wbrnąc gdy grep odmawia współpracy ze względu na otrzymywane binarne dane wejsciowe:
    cat plik_jakis | grep -a "szukana fraza"
    

  • Jak wyciagnac zawartosc RPM (RedHatPackageModule) do aktualnego katalogu
      rpm2cpio jakis rpm | cpio --extract
    

    *******************************************************************************************


  • Jak w Ubuntu 10.04 skorzystac z programow dos2unix i unix2dos (wypdaly z dystrybucji?):
     sudo apt-get install tofrodos
     cd /usr/bin
     sudo ln -s fromdos dos2unix
     sudo ln -s todos unix2dos
    
  • Jak odtworzyc liste paczek zaintalowanych na kompie A na kompie B:
    1.Na kompie A:
     dpkg --get-selections > /home/user/lista_paczek
    
    2.Na kompie B:
     scp user@komp_A:/home/user/lista_paczek /home/user/lista_paczek
     dpkg --set-selections < /home/user/lista_paczek
     dselect
    
    Proste?
    UWAGA! Jezeli polecenie 'dselect' jest niedostepne uzyj:
      sudo apt-get dselect-upgrade
    

    Mozna jeszcze prosciej - na kompie B wydaj polecenia:
     ssh user@kompa_A "dpkg --get-selections" | dpkg --set-selections
     dselect
    
    UWAGA! Zamiast dselect'a mozesz uzyc polecenia
     sudo apt-get -u dselect-upgrade
    
  • Od pewnego czasu Debian po wydaniu polecenia 'apt-get update' zwraca w stylu: "This must be accepted explicitly before updates for this repository can be applied" Aby wylaczyc te ostrzezenie i zarazem zaakceptowac zamiane wersji nalezy:
    apt-get update --allow-releaseinfo-change
    
    A potem mozna juz jak zwykle wydawac polecenie 'apt-get update'. Uwazaj jednak powyzsze operacje troche moga namieszac w Twoim kompie.

  • Jak sprawdzic w jakiej wersji (ilo bitowej) masz system Debian/Ubuntu:
    dpkg --print-architecture
    
    Dla systemów 64 bitowych (zgodnych z X86) wypisany powinien byc tekst:
    amd64

    dla systemów 32 bitowych (zgodnych z X86) wypisany powinien byc tekst:
    i386


  • Jak przejrzec zawartosc pliku z initram'em (przydatne dla early-userspace code - czyli opcja pozwalajaca na kompilacje kernela i zlinkowanie z mikro-filesystemem do jednego wiekszego pliku)
     zcat initramfs_data.cpio.gz | cpio -t
    
  • Jak rozpakowac do katalogu t1 zawartosc pliku "plik.cpio.gz":
     mkdir t1
     gunzip plik.cpio.gz
     cd t1
     cpio -imVd -I ../plik.cpio 
    
    (Uwaga!!! Nie rob ostatniej operacji cpio -imVd w glownym katalogu, a juz na pewno z prawami root'a - zniszczysz sobie glowny katalog a zatem caly system).
  • Jak zawartosc katalogu wrzucic do pliku "plik.cpio.gz":
     find  -depth -print | cpio -o -H newc | gzip > ../plik.cpio.gz
    
  • Jak zrobic minimalny initramfs, z jednym plikiem wykonywalnym - np.: gdy chcesz spradzic dzialanie twojej prostej aplikacji ale nie masz ochoty robic calego systemu plikow, co jest dosc pracocholonnym zadaniem, bo trzeba uwzglednic poprawna zawartosc katalogu /dev, umiescic odpowiednie biblioteki zaleznie od wymagan programow (Zrodlo: http://www.mjmwired.net/kernel/Documentation/filesystems/ramfs-rootfs-initramfs.txt):
    Tworzymy plik 'hello.c' o zawartosci:
    #include <stdio.h>
    int main(int argc, char *argv[]){
     printf("Hello world!\n");
     for(;;);
     return 0;
    }
    
    Kompilujemy go (kluczowe jest aby kompilat byl statycznie linkowany!!!):
     gcc -static hello.c -o init
    
    A teraz tworzymy spakowany plik CPIO:
     echo init | cpio -o -H newc | gzip > test.cpio.gz
    
    Calosc latwo sprawdzic emulatorem QEMU:
     qemu -L . -m 128 -hda null.img -kernel vmlinuz -initrd test.cpio.gz
    
    To powyzsze testowanie przeprowadzisz dla QEMU windowsowego, z zalozeniem ze w aktualnym katalogu sa pliki z BIOSem, VGA BIOSem i keymap'ami, oraz jest plik 'null.img' ktory 'udaje' dysk (moze tu byc pustym plikiem), a plik 'vmlinuz' jest testowanym kernelem (bez niego nie bardzo jest jak pracowac)! W wywolaniu podano takze konfiguracje sieci zakladajac ze jest zainstalowany interfejs TUN/TAP - w przeciwynm przypadku usun calos: -net nic -net tap,ifname=coLinux-TAP, lub zmodyfikuj. Wynikiem jest pokazanie w konsoli - tam gdzie kernel "wypluwal" swoje raporty podczas wstawania - napisu:
    Hello world!
    
    i zatrzymanie pracy - bo normalnie proces init (czyli tutaj nasz program) powinien powolac inne programy do zycia, czego nie zrobilismy.

  • Jak uruchomic QEMU emulujacy PC bootowalny z CDROM'u (tu jest to plik 'cdrom.iso' z obrazem plyty) na ktorym jest FS' uruchamiajacy server www (port 80)
     qemu -L . -m 128 -hda null.img -boot d -cdrom cdrom.iso -net nic -net user -redir tcp:8080::80
    
    Po uruchomieniu WinXP zapyta czy chcesz zablokowac nowy port (tu 8080) - powinienes jednak go nie blokowac, a zaraz po uruchomieniu tego systemu goscia w QEMU uruchom przegadarke i wpisz adres: http://localhost:8080 (pod warunkiem ze system gosc uruchomi serwer www na porcie 80 wewnatrz wirtualizacji QEMU).

    Zabawy z "czasem":
  • Jak wlaczyc jakis program za jedna minute
      at -f nazwa_programu now + 1 minutes
    
  • Jak sprawic (z poziomu user'a) aby program uruchamial sie co minute (az do wylaczenia komputera): 1.Tworzymy plik /home/user/skrypt_at.sh:
      #!/bin/sh
      cos_do_zrobienia
      at -f /home/user/skrypt_at.sh now + 1 minutes
    
    Gdzie: cos_do_zrobienia - to wlasciwe zadanie wykonywane co 1min. Uwaga powinno byc ono wykonywane krocej niz jedna minuta. W innym przypadku kolejka 'at' moze sie zapchac!!!.
    2.Uruchamiamy po raz pierwszy ten skrypt z "palca":
      /home/user/skrypt_at.sh
    
    I czekamy, aby upewnic sie czy jednak bedzie wykonywane co jakis czas, mozna sprawdzic co jest w kolejce przez wywolanie polecenie 'atq'. Usuwanie zadan z tej kolejki przez 'atrm numer_zadania'.
  • A co pordzic na problem z genrowaniem dodatkowych a mocno wkurzajacych listow z komunikatem "warning: commands will be executed using /bin/sh"? czy wogole wylaczeniem generowania listow (co 1 min to dziennie mamy ich 1440!)
    Pare faktow:
    -polecenie "at" nie ma mozliwosci wylaczenia generowania email'i gdy zastosujemy jakas opcje,
    -polecenie "at" generuje malo sensowne "warning: commands will be executed using /bin/sh" mimo ze wszystko jest ok - a nie znalazlem w sieci metody jak napisac skrypt z uzyciem 'shebang' tak aby 'at' sie nie czepial.
    Proponuje abys napisal tak (choc to malo elegancka filtracja - bo mozesz przegapic cos waznego - to dziala):
      #!/bin/sh
      cos_do_zrobienia
      at -f /home/user/skrypt_at.sh now + 1 minutes 2>/dev/null
    
  • Jak sprawic aby program uruchamial sie co minute poki komputer jest wlaczony (uwaga tu juz bez root'a nie zadziala): Zalozmy ze zadanie ma byc wykonywane co 20 minut non-stop oraz ze zadanie to bedzie zapisane w pliku '/home/user/skrypt_cron.sh'. Wpisujemy do '/etc/crontab' na koncu:
    0-59/20 * * * * user /home/user/skrypt_cron.sh
    
    Jezeli chcielibysmy dodatkowo wyslac list (za pomoca mutt'a) z informacja ze zadanie zostalo rozpoczete wpisz:
    0-59/20 * * * * user ((echo -n "Job started at " ; date ; \
     				mutt -x -s "User cron jobs" user@twoj_prawdziwy_serwer_pocztowy ; \
    				/home/user/skrypt_cron.sh)
    
    W ostatnim przykladzie: User cron jobs - tytul listu jaki bedzie wysylany user@twoj_prawdziwy_serwer_pocztowy - twoj prawdziwy email
    UWAGA! Twoj komputer musi potrafic wysylac listy w swiat (np.: przez EXIM'a)!!!
  • Jak dopisac cos do mojego cron'a (czyli bedzie sie wykonywac caly cron jako ja):
     crontab -e
    
    A tutaj można postawić pytanie: jak zarchiwizowac to co w moim cronie jest wpisane?
    
     crontab -l > plik_z_archiwum_crona.txt
    
    A jak takie crontab'y z tego archowum zaladowac
    
     crontab plik_z_archiwum_crona.txt
    
    Czyli prosto, skoro mozna zarchiwizowac cale podrzewo: /var/spool/cron
    lub /var/spool/cron/nazwa_usera, gdy chcemy to uczynic dla tylko jednego usera.
    Zestaw trikow (lub raczej elementarnych polecen):
  • Jak zarchiwizowac katalog i podkatalogii:
      tar zcvf plik.tar.gz .
      uzywasz '.' jezeli pragniesz pakowac aktualny katalog
    
  • Jak rozpakowac archiwum xxxx.tar.gz lub xxxx.tgz
      tar zxvf plik.tar.gz 
      tutaj rozpakujesz do aktualnego katalogu
    
  • Jak rozpakowac archiwum xxxx.tar.bz2
      tar jxvf plik.tar.bz2
      tutaj rozpakujesz do aktualnego katalogu
    
  • Jak sciagnac (mirrorwac) strony z internetu: (uwaga z stronami zawierajacymi java script)
      wget -m --no-parent jakis_URL_do_strony_z_http
    
  • Jak sciagnac strone z internetu i policzyc liczbe jej znakow (uwaga! nie sprawdza sie czy w ogole strona jest dostepna - problem sieciowy, serwera, itp.):
    wget http://www.linux.pruszkowski.net -O - 2>/dev/null | wc -c
    
  • Jak zbadac czy wielkosc partycji gdzie zamonotowano '/home' zmniejszyla sie ponizej okreslonego poziomu - wypisujac cyfre 1 (tu: 10 - czyli 10% calej pojemnosci tej partycji):
    test `df | grep "/home" | awk '{print $5}' | tr '%' ' '` -lt 10 && echo "1"
    
    Oczywiscie zamiast polecenia echo "1", mozna napisac:
    test `df | grep "/home" | awk '{print $5}' | tr '%' ' '` -lt 10 \
    && mutt -x -s "Uwaga! Na /home <10% wolnego" email@serwer_twojej_skrzynki_email
    
  • Jak sciagnac zawartosc strony "zachaslowanej":
    curl --user name:password http://jakas_tam_strona
    
  • Jak za pomca AWK podejrzec jakie ID maja uzytkownicy:
    cat /etc/passwd | awk -F ":" '{print $1"->"$3}'
    
  • Jak podgladac na bierzaco logi z filtrowaniem via grep:
    tail -f error.log | stdbuf -i0 -o0 grep --line-buffered "Invalid"
    
    Wstawienie tuz przed grep:
    stdbuf -i0 -o0
    
    wylacza buforowanie danych wejsciowych i wyjsciowych.
    Moje modyfikacje systemu:
  • Skrypt ktory czyta z: /proc/meminfo i /proc/net/sockets i przerabia dane tak aby wyslac na /dev/ttyS0 (a na RS232 podpieto C51 lub AVR ktory odbiera dane i wyswietla na LCD do niego podpietym) info o: ilosci wolnej pamieci i ilosci otwartych gniazd
      #!/bin/bash 
      my_time=0
      max_sock=0
      total_max=0
      while [ 1 ]; do
       mem_v=`cat /proc/meminfo | grep "MemFree:" | sed -e "s/ //g"`
       sock_v=`cat /proc/net/sockstat | grep "sockets:" | sed -e "s/used//" | sed -e "s/ //g" | cut -f2 -d ":"`
       if [ $sock_v  -gt $max_sock ]; then
         let max_sock=sock_v
         let my_time=0
         if [ $sock_v -gt $total_max ]; then
           let total_max=sock_v
         fi
       fi
       echo $mem_v $sock_v [$max_sock, total max. $total_max] > /dev/ttyS0
       sleep 1
       let my_time+=1
       if [ $my_time -eq "60" ]; then
         let max_sock=0 
         let my_time=0
       fi
      done
    
    Jezeli chcesz wykonywac krokowo ten skrypt zmien pierwsza linie na:
      #!/bin/bash -x
    
    Mozesz tez ustawic prace krokowa dla pewnej grupy linii, modyfikujac powyzszy skrypt (pozostaw #!/bin/bash, bez opcji '-x'):
         ...
         #przyklad uzycia selektywnego opcji '-x' -> tu wlaczmy prace krokowa
         set -x
         if [ $sock_v -gt $total_max ]; then
           let total_max=sock_v
         fi
         #przyklad uzycia selektywnego opcji '-x' -> tu wylaczamy prace krokowa
         set +x
         ...
    
  • Aby ALT-CTRL-DEL dawal zatrzymanie systemu:
     w pliku inittab
     odszukaj linie (i zmodyfikuj tak):
    
     # What to do when CTRL-ALT-DEL is pressed.
     ca:12345:ctrlaltdel:/sbin/shutdown -h now
    
  • A moze by tak zdalnie pewna liste (tu: majace IP: 192.168.1.{2,3,70,200}) komputerow wylaczac?
    for i in $(echo "2 3 70 200"); do ping -c 1 192.168.1.$i 2>&1 1>/dev/null && ssh -t user@192.168.1.$i "sudo shutdown -h now"; done
    
    Uwaga!!! -podejscie zaklada ze komputery beda w tej samiej sieci IP tu: 192.168.1.xx -komputery sa pingowalne, jezeli nie odpowie to bedzie pominiety -na komputerach masz zainstalowane polecenie sudo i uzytkownik 'user' przy jego pomocy osiagnie prawo do uruchomienia polecenie 'shutdown'
  • A moze terminal RS232 na koncu kabla polaczony z naszym linuxem:
     w pliku inittab
     odszukaj linie (i zmodyfikuj tak):
    
     T0:23:respawn:/sbin/getty -L ttyS0 1200 vt52
    
     teraz mozesz podlaczyc urzadzenie z parametrami:
     -L    - tryb pracy 3 przewodowy
     ttyS0 - lacznosc przez RS232 numer 1 (czyli stray dobry COM1)
     1200  - szybkosc transmisji [bps]
     vt52  - i wiadomo jakim znaczkami zasypie nas linuks (czyli standard VT52)
    
  • Aby Twoj Debian oprocz napisu np.: DEBIAN GNU/..... tty1, pokazal jaki interfejs eth0 ma numer IP
      wpisz (to i nastepne jako root!) do /etc/init.d/issue:
    
      #!/bin/bash
      #stara wersja:
      #ip=`ifconfig eth0 | grep inet | cut -d":" -f2 | cut -d" " -f1`
      #nowa wersja (gdy brak ifconfig)
      ip=`ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -d"/" -f1`
      echo "Debian GNU/Linux \n \l [$ip]" > /etc/issue
      echo "Debian GNU/Linux [$ip]" > /etc/issue.net
    
      nadaj prawa do wykonania:
      >chmod 755 /etc/init.d/issue
    
      oraz zrob dowiazanie:
      >update-rc.d issue defaults 99
    
      dzieki niemu w czasie startu systemu zostanie jako ostatni wykonany S99issue
      czyli tak naprawde /etc/init.d/issue
    
      Jezeli chcesz usunac tak dodany "serwis" wydaj polecenie:
      >update-rc.d -f issue remove
    
  • A co z SlackWare? (mowa o podawaniu numeru IP na konsole)
      wpisz do /etc/rc.d/rc.local na koncu:
    
      ip=`ifconfig eth0 | grep inet | cut -d":" -f2 | cut -d" " -f1`
      echo Welcome to Linux `/bin/uname -a | /bin/cut -d\ -f3` [$ip] > /etc/issue
    
      Uwaga! 
      Plik /etc/rc.d/rc.local to jest ostatni plik uruchamiany podczas 
      startu systemu (pierwszy to rc.S, pozniej ewentualnie rc.M, ...)
      Jezeli numer DHCP jest pobierany pozniej niz wywolanie tego pliku
      przetwarzanie numeru nie da rezultatu (nie bedzie fizycznego 
      urzadzenia eth0), te kwestie trzeba dokladnie przeanalizowac, dla 
      swojej konfiguracji.
    
  • Jak sprawic aby Twoj RedHat (5.2) umial wyciagnac numer DHCP dla siebie:
      Plik: /etc/sysconfig/network
      ma zawierac:
      NETWORKING=yes
      FORWARD_IPV4=false
      
    
      Plik: /etc/sysconfig/network-scripts/ifcfg-eth0 (jezeli posiadasz inny interfejs zamien eth0 na cos innego!)
      ma zawierac:
      DEVICE=eth0
      ONBOOT=yes
      BOOTPROTO=dhcp
      
    
    
  • Jak wpisac alias do /etc/conf.modules (Tylko RedHat, w Debianie trzeba to robic inaczej)
      Kazda pozycja moze wygladac np.:
      alias eth0 ne
      options ne io=0x300
      
      Czyli interfejs 'eth0' jest synonimem modulu 'ne' o opcji io=0x300 (niektore moduly tego potrzebuja)
    
  • Jak zestawic poloczenie po laczu szeregowym z innym kompem:
      slattach -d -L -p slip -s 9600 /dev/ttyS0 &
      sleep 10
      ifconfig sl0 10.0.0.2 netmask 255.255.255.0 up
    
      gdzie:
      /dev/ttyS0    - lacze szeregowe
      -p slip       - bez kompresji naglowka
      -d            - ?
      -L            - lacznosc trzy przewodowa (miedzy komputerami)
      10.0.0.2      - numer IP interfejsu lokalnego
      255.255.255.0 - maska - wyznacza ilosc interfejsow w tej pseudo podsieci
                      Uwaga! drugi komp. moze miec numer IP typu 10.0.0.xxx                
    
  • Jak zmienic szybkosc transmisji na 1200 na laczu RS232 (np.: /dev/ttyS0)
      stty -F /dev/ttyS0 ispeed 1200 ospeed 1200
    
      jezeli nie wierzysz ze sie zmienilo to napisz:
      stty -F /dev/ttyS0
      Uwaga jezeli dodasz -a pokaza ci sie inne opcje ktore tez mozna modyfikowac!
    
      Jezeli nie chcesz aby CRT i CTS kontrolowaly przeplyw danych to napisz
      stty -F /dev/ttyS0 -crtscts
    
      aby przywrocic kontrole:
      stty -F /dev/ttyS0 crtscts
    
    Jezeli chcialbys pokombinowac przy wlaczaniu RTSa i sprwadzaniu CTSa to ponizszy program skampiluj w C: rts_cts.htm

  • Jezeli posiadasz lacze szeregowe lub aplikacje ktore wymagaja odpowiednich wymiarow ekranu sprobuj:
      stty rows 32 cols 132
    
    A przestawisz sobie terminal w tryb 132 kolumny na 32 linie. Jezeli chcecz aby np.: putty przestawił okno na 84 kolumny i 25 wierszy mozesz sprobować:
      printf '\033[8;40;124t'
    

  • A moze pragniesz posluchac co w necie slychac, czyli jak uruchomic tcpdump na jakims interfejsie (nie zapmnij go sciagnac i skompilowac!)
      tcpdump -i sl0 -l -w - | tee dat | packprint - 
    
      I moze pare wyjasnien:
      tcpdump   - znany program do podgladania pakietow 
                  -i sl0 - przechwycienie tego co "biega" po sl0 (slip)
                  -l     - za man-em: sprawia ze linie w stdout sa buforwane, 
                           uzyteczne gdy pragniesz przechwytywac dane (np.: z tee)
                  -w -   - generowanie danych na stdout 
      tee dat   - czyta z 'stdin', pisze do 'dat' oraz do 'stdout'
      packprint - drukuje w "ladny sposob" wyglad pakietu, info o tym oprogramowaniu 
                  znajdziesz pod: PackPrint 
                  jezeli pragniesz mirrora: mirrored packprint-0.0.2.tar.gz
    
  • A jezeli chcialbys aby tcpdump pokazal troche wiecej informacji a nie chcesz uzywac programu packprint?!
      tcpdump -i sl0 -X -s 1500
      
      Wyjasnienie - opcje: 
         -X     - Wyswietlaj informacje w formacie HEX (w ascii czasami sa nie 
                  czytelne
         -s     - Podawane beda informacje z pakietu o maksymalnej 
                  dlugosci 1500 bajtow
    
  • A jezeli chcialbys poprostu odfiltrowac z strumienia dane drukowalne (ascii)
      tcpdump -i sl0 -l -s 1500 -w - | strings
    
  • A jezeli chcialbys obejrzec pakiety na konkretnym porcie TCP i zwiazane z okreslonym IP
      tcpdump -ni eth0 tcp port 80 and host 192.168.1.2
    
  • A jezeli powyzsze jest za proste (np.: wiecej IP)
      tcpdump -ni eth0 tcp port 80 and \(host 192.168.1.2 or host 192.168.1.3\)
    
  • A moze chcialbys zwyczajnie uzyc tcpdump do ogladania w HEX (opcja: -xX) pakietow na eth0 i do tego dla protkolu UDP na porcie np.: 1234:
      tcpdump  -xX -B 1000  -ni eth0 -s 0 udp port 1234
    
  • A moze chcesz na np.: WinXP (pamietaj aby wylaczyc aktuazliacje wiresharka na WinXP - bo stara instalacje odinstaluje a nowej odmowi instalownia!!!) za pomoca WireSharka przegladac zebrane na odleglej maszynie pakiety? [Zrodlo: remote-capture-via-ssh-and-pipe]
      plink.exe -ssh -pw twoje_haslo twoj_login@numer_ip_zdalnej_maszyny "sudo tcpdump -ni eth0 -s 0 -w - not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -
    
    UWAGA!
    -podawanie hasla za pomoca opcji: "-pw twoje_haslo", jest malo bezpieczne (wszyscy majacy dostep do WinXP widza podane w ten sposob haslo, np.: przez konsole w ktorej wykonano polecenie),
    -polecenie "sudo tcpdump..." wskazuje ze na zdalnej maszynie musisz dla user'a 'twoj_login' przydzielic prawa 'sudo' bez proszenia o haslo!!! - co jak wiadomo jest malo bezpieczne,
    -ta metoda nie daje mozliwosi analizy na zdalnej maszynie pakietow ssh! (bo uzylismy opcji: "not port 22"), trzeba uzyc mocniejszego filtrowania,
    -metoda zaklada ze analizowany ruch nie bedzie zbyt duzy, jak sie domyslasz caly ruch na 'eth0' bedzie przekazywany miedzy komputerami (WinXP a zdalna maszyna).
  • Jezeli chcesz aby dane z zdalnego systemu (tam gdzie dziala tcpdump) splywaly do wireshark'a niemal natychmiast mozesz uzyc opcji -U w wywolaniu tcpdump:
      plink.exe -ssh -pw twoje_haslo twoj_login@numer_ip_zdalnej_maszyny "sudo tcpdump -U -ni eth0 -s 0 -w - not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -   
    
    Czasami system w takich przypadkach pracuje nieco niestabilnie!
  • Jezeli tcpdump odmiawia nasluchiwania jako zwykly uzytkownik (a taki jest z reguly) tu: 'user' a wolalbys oszczedzic 'sudo', mozesz zmienic odpowiednie prawa dostepu dla programu tcpdump, zaloguj sie jako root (lub wydaj polecenie: 'sudo -s'):
      groupadd pcap
      usermod -a -G pcap user
      chgrp pcap /usr/sbin/tcpdump
      chmod 750 /usr/sbin/tcpdump
      setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
    
    Uwazaj jednak bo zostawiasz furtke innym userom, ktorzy jezeli beda nalezac do grupy 'pcap' beda mogli nasluchiwac na caly ruch sieciowy w tej maszynie!
    Teraz mozesz cieszyc sie snifowaniem poprzez maszyne odlegla:
      plink.exe -ssh -pw twoje_haslo twoj_login@numer_ip_zdalnej_maszyny "/usr/sbin/tcpdump -U -ni eth0 -s 0 -w - not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -
    
    Tu wywolano tcpdump podajac sciezke absolutna - inaczej w podanym podejsciu system jej nie znajdzie. Jezeli cos nie dziala sprawdz czy podana sciezka do tcpdump jest prawidlowa.
  • Jak odkryc liste kart sieciowych z ich metoda utworzenia (jakie urzadzenia je realizuja lub na jakich magistralach "siedza"):
    ls -la /sys/class/net
    
    Na bazie powyzszego dowiesz sie, ze:
    lrwxrwxrwx  1 root root 0 mar 19 09:03 eth0 -> ../../devices/pci0000:00/0000:00:03.0/net/eth0
    lrwxrwxrwx  1 root root 0 mar 19 09:03 lo -> ../../devices/virtual/net/lo
    

  • Dlaczego moze nie dzialac PonyProg pod RedHat-em 6.0
    Zakladajac ze sciagnoles oprogramowanie do PonyProg-a i juz je zainstalowales, i mimo to nie "widzi" portow COM (momo ze user ma prawa do pisania dla /dev/ttySx). Sprawdz jakie masz prawa do plikow w /var i szczegulowiej /var/lock
  • Jak automatycznie uruchamiac karte RS8UPS (w REDHAT 5.0)

  • Zakladam ze:
    -jest zamontowana w przestrzeni io (bez konfliktow) pod adresem 0x100 (patrz zworki)
    -jest podlaczona jako 11 irq (patrz zworki),
    1.Utworz wezly:
     mknod /dev/ttyS4 c 4 68 
     mknod /dev/ttyS5 c 4 69 
     mknod /dev/ttyS6 c 4 70 
     mknod /dev/ttyS7 c 4 71 
     mknod /dev/ttyS8 c 4 72 
     mknod /dev/ttyS9 c 4 73 
     mknod /dev/ttyS10 c 4 74 
     mknod /dev/ttyS11 c 4 75 
    
    2.Napisz skrypt o nazwie: /etc/rc.d/init.d/rs8ups z atrybutami do wykonania!:
    #!/bin/sh
     echo  -n "Starting RS8UPS (io=0x100, irq=11)"
     setserial /dev/ttyS4 port 0x100 UART 16550A irq 11 Baud_base 115200
     setserial /dev/ttyS5 port 0x108 UART 16550A irq 11 Baud_base 115200
     setserial /dev/ttyS6 port 0x110 UART 16550A irq 11 Baud_base 115200
     setserial /dev/ttyS7 port 0x118 UART 16550A irq 11 Baud_base 115200
     setserial /dev/ttyS8 port 0x120 UART 16550A irq 11 Baud_base 115200
     setserial /dev/ttyS9 port 0x128 UART 16550A irq 11 Baud_base 115200
     setserial /dev/ttyS10 port 0x130 UART 16550A irq 11 Baud_base 115200
     setserial /dev/ttyS11 port 0x138 UART 16550A irq 11 Baud_base 115200
     echo
    
    3.Utworz link:
     ls -s /etc/rc.d/init.d/rs8ups /etc/rc.d/rc3.d/S09rs8ups
    
    UWAGA!
    -katalog rc3.d - jest ustawiony dlatego, ze w moim systemi ten poziom (run level) jest uruchamiany!!!
    -nazwa symboliczna S09rs8ups - jest taka gdyz wazna jest u mnie kolejnosc wykonywania skryptow (przed innym ktory bazuje na pracy tego skryptu)
    Mozna probowac sprawdzac czy karta RS8UPS zostala poprawnie skonfigurowana przez setseriala
  • Jak dowiedziec sie cos o urzadzeniu USB (przydatne gdy chce sie uzywac przejsciowek USB-RS232 oraz porzytecznego ale nieco zawilego narzedzia UDEV)

  • udevadm info -a -p $(udevadm info -q path -n /dev/ttyACM0)
    
    Wynik moze wygladac podobnie do tego:
      looking at device '/devices/pci0000:00/0000:00:1d.2/usb4/4-1/4-1:1.0/tty/ttyACM0':
        KERNEL=="ttyACM0"
        SUBSYSTEM=="tty"
        DRIVER==""
    
      looking at parent device '/devices/pci0000:00/0000:00:1d.2/usb4/4-1/4-1:1.0':
        KERNELS=="4-1:1.0"
        SUBSYSTEMS=="usb"
        DRIVERS=="cdc_acm"
        ATTRS{bInterfaceNumber}=="00"
        ATTRS{bAlternateSetting}==" 0"
        ATTRS{bNumEndpoints}=="01"
        ATTRS{bInterfaceClass}=="02"
        ATTRS{bInterfaceSubClass}=="02"
        ATTRS{bInterfaceProtocol}=="01"
    ...
        ATTRS{serial}=="292382383893834384738438"
    ...
    
    Ta ostatnia podana tu linia jest tu dosc istotna bo pozwala zbudowac regule UDEV'a ktora zapewni ze wetkniecie tego urzadzenia moze zaowocaowa automatycznym wykerowaniem linku symbolicznego np.: /dev/moja_przejsciowka. Ale aby to zrobic trzeba poczytac o budowaniu regul dla udev (uwaga w Ubuntu reguly sa umieszczane zarowno w /lib jak i /etc).

  • Jak uruchomić zdalny serwer portu szeregowego (tu: /dev/ttyUSB0)
    sudo socat TCP-LISTEN:11001 /dev/ttyUSB0,b115200,raw,echo=0
    
  • Jak uruchomić serwer HTTP serwujacy jeden plik (gdy cos trzeba szybko wyciagnac), przegladarka uzywa portu 8080:
      socat TCP-LISTEN:8080,fork,crnl SYSTEM:'printf \"HTTP/1.1 200 OK\\n\\n\"\; cat main.cpp'
    
  • Gdybys chcial jednak nieco bardziej zaawansowane podejscie ale proste w uzyciu - skorzystaj z potegi Python'a:
      python -m SimpleHTTPServer 8080
    
    gdybys stosowal wersej 3 Python'a uzyj:
      python -m http.server 8080
    
    
    
    
    
    
  • Jak za pomoca polecen shell'owych i paru z coreutils postawic serwer WWW na porcie 8080 (Baza z opisu Netcat as Webserver, uwaga jest to jedna dluga linia:
    while true; do { echo -e "HTTP/1.1 200 OK\r\n\r\n<html><head><meta http-equiv=\"refresh\" content=\"5\"></head><body>Now it is `date`<br>Interfaces<pre>`ip a | grep inet`</pre>Processes:<pre>`ps aux`</pre></body></html>"; } | nc -l -p 8080 -q 1; done
    
    Tresc serwowanego pliku jest tu trywialna, ale pomysl ze mozna w ten sposob wyciagac cale pliki (np.: /etc/passwd)!
  • Jak nie majac polecenia 'watch' (np.: pod openwrt), cyklicznie wywolywac polecenie 'netstat' (podobnie mozna z innymi):
    while true; do { clear; netstat -antlp; sleep 10; }; done
    
    Gdzie 'clear' na poczatku ulatwia ogladanie, a 'sleep 10' nie da zaglodzic systemu operacyjnego.

  • Jak prosto przeslac plik miedzy dwoma kompami przy pomocy kabla NULL-modem i dwoch konwerterow usb2rs232:
      KOMP1:
      sx -X plik_do_przeslania < /dev/ttyUSB0 > /dev/ttyUSB0
    
      KOMP2:
      rx -X plik_do_przeslania < /dev/ttyUSB0 > /dev/ttyUSB0
    
    I po dlugim czasie (zaleznie od wielkosci pliku) przy transferze np.: 9600 plik zostanie przeslany z KOMP1 na KOMP2.
  • Jak wpisac cos do ARP cache

  • Napisz:
     arp -i eth1 -s 192.168.1.11 01:02:03:04:05:06
    
     Zalozenia:
     -i eth1           - nazwa interfejsu dla ktorego bedzie wpis dzialal
     -s 192.168.1.11   - numer IP odleglego urzadzenia
     01:02:03:04:05:06 - numer MAC urzadzenia do ktorego bedzi odnosil sie IP
    


  • Jak utworzyc plik o wielkosci X bajtow o zawartosci losowej, a potem jak go wydluzyc o Y bajtow ale zawartoscia z samych zer

  • Napisz:
     dd if=/dev/random of=./test-file bs=1 count=X
    
    a teraz dodajemy "zera":
     
     dd if=/dev/zero of=./test-file bs=1 conv=notrunc seek=X count=Y
    

  • Jak najprosciej przeskanowac dysk pod katem BAD-SECTORs:

  • Napisz:
    dd if=/dev/sda of=/dev/null bs=1m conv=noerror
    

  • Jak wykonac pewna czynnosc (np.: polecenie 'du -sh') cyklicznie - ale najprosciej:
     watch -n 1 du -sh
    
    UWAGA!!! Nie ustawiaj parametru dla '-n' zbyt malego - system sie nieco zacina (musi non stop cos sprawdzac)!!!
  • Jak spawdzic czy dany katalog juz istnije i utworz jezeli nie ma go

  • Napisz w skrypcie:
    $nazwa='jaka_nazwa'
    if [! -d  $"$nazwa" ]; then 
     mkdir $nazwa
    fi
    

  • Jak znalezc pliki z rozszerzeniem TXT, w ktorych jest "szukany_test" tak aby dowiedziec sie w jakim pliku znaleziono i w jakiej linii tego pliku (szukanie nastepuje od aktualnej pozycji rekurencyjnie w podkatalogi, bez uwzgledniania wielkosci liter)

  • Napisz w lini polecen:
    grep -ni szukany_tekst `find . -type f -name "*.txt"`
    
    lub:
    
    find . -name "*"  -print0 | xargs -0 grep -ni szukany_tekst
    

  • Jak skorzystac z polecenia 'dd' pod windowsami! (Dokladnie jak skopiowac obraz cdroma do pliku)

  • Napisz w lini polecen (oczywiscie windowsowej, o ile wczesniej skopiowales narzedzia 'dd' dla win32 w miejsce widoczne w sciezce, UWAGA! Dodanie bs=1048576, sprawia ze calosc dziala rozsadnie szybko gdyb dac bs=1024, wtedy czas operacji bylby nieznosnie dlugi!):
    dd if=\.\CDROM0 of=cdrom.iso bs=1048576
    
    lub - gdy pierwsze nie zadziala (?)
    
    dd if=/dev/sr0 of=cdrom.iso bs=1048576
    
    BTW: Nie zniszcz sobie przez pomylke zawartosci waznego dysku!!!
    

  • Jak odczytac dane pracy o dysku (wymagana obsluga S.M.A.R.T. przez dysk) - dane pokazuja takze przyblizona temperature.
    smartctl -a /dev/hda 
    
  • Jak przetestowac dysk (wymagana obsluga S.M.A.R.T. przez dysk), procedura krotka:
    smartctl -t short /dev/sda
    
    Test 'short' trwa krotko, dla pelnego testowania mozna wydac polecenie 'long':
    smartctl -t long /dev/sda
    
    Dla oby polecen aby zobaczyc postep wydaj polecenie, np.:
    smartctl -a /dev/sda
    
    A zobaczysz:
    SMART Self-test log structure revision number 1
    Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
    # 1  Short offline       Self-test routine in progress 90%      3451         -
    
    Co wskazuje ze pozostalo 90% pracy do zrobienia. Jezeli zakonczy sie test zobaczysz:
    SMART Self-test log structure revision number 1
    Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
    # 1  Short offline       Completed without error       00%     12689         -
    
    UWAGA!!! aby podgladac postep trzeba za kazdym razem wydac polecenie "smartctl -a /dev/sda".
    Aby podgladac stan na biezaco wydaj polecenie:
     watch -n 20 smartctl -l selftest /dev/sda
    
  • Jak sprawic aby nowy dysk swiezo sformatowany i widoczny jako '/dev/sda4', i aby 'user1' mial automatycznie podmontowany przy kazdym starcie, i co wiecej aby mogl z niego normalnie kozystac:
    1.Utworz katalog jako 'user1' i to w jego home, np.:
    mkdir /home/user1/sda4
    
    2.Wpisz na koncu pliku '/etc/fstab' (jako root!):
    /dev/sda4       /home/user1/sda4     ext3    user,exec       0       1
    
    lub (dla partycji FAT32 - od tak aby linux i winda widzialy ten sam dysk):
    /dev/sda4       /home/user1/sda4     vfat    user,exec,rw,auto,umask=0 0 0
    
    lub (dla dysku sieciowego):
    //adres/user_name       /home/user/cifs_dysk_sieciowy    cifs    username=user_name,rw,noauto,uid=_jako_kto_,gid=_jako_czyja_grupa_,dir_mode=0770,user  0  0
    {gdzie:
    adres - adres sieciowy dysku sieciowego
    user_name - username lub udzial na tym dysku sieciowym 
    cifs_dysk_sieciowy - miejsce gdzie bedzie montowany udzia sieciowy
    _jako_kto_ - na poczet kogo wykonane bedzie montowanie (typowo: 1000 - ale patrz /etc/passwd)
    _jako_czyja_grupa_ - na poczet jakiej grupy to montowanie (typowo: 1000 - ale patrz /etc/groups)
    }
    
    3.Zrestartuj kompa(!)
    
    4.Jako root zmien prawa do nowego punktu montowania:
    chown user1:user1 /home/user1/sda1
    
    5.I teraz po kazdym reboocie mozesz jako 'user1' cieszyc sie nowym dyskiem
    

  • Jak sprawdzic jaka jest kondycja systemu plikow:
    sudo tune2fs -l /dev/sda3
    
  • Jak sprawic aby system zbyt czesto nie sprawdzal stanu systemu plikow, np.: ustawic na co 60 montowan automatyczne sprawdzenie :
    sudo tune2fs -c 60 /dev/sda3
    
    lub aby sprawdzenie bylo zrealizowane po okreslonej dacie, np.: za dwa miesiace (mozna uyc wartosci 0 - nigdy nie bedzie automatycznie sprawdzal stanu systemu plikow, ale uwazam ze jest to nierozsadne):
    sudo tune2fs -i 2m /dev/sda3
    

  • Jak na szybko i w miare pewnie (np.: o rany a jakie /dev/... ma ten dysk? o rany widze wiele dyskow ktory to ten wlasciwy?) podmonotowac dysk USB i sprawic aby byl widziany przez user jako jego wlasny zasob z prawami do dopisywania w jego glownym katalogu.
    1.Ustalamy w jakim /dev/... bedzie on widoczny - teraz wlaczamy dysk i wydajemy polecenie:
     dmesg | grep sd
    
    Dostajemy cos podobnego do tego:
    [  643.873655] sd 8:0:0:0: [sde] 976773168 512-byte hardware sectors (500108 MB)
    [  643.874274] sd 8:0:0:0: [sde] Write Protect is off
    [  643.874281] sd 8:0:0:0: [sde] Mode Sense: 08 00 00 00
    [  643.874284] sd 8:0:0:0: [sde] Assuming drive cache: write through
    [  643.879278] sd 8:0:0:0: [sde] 976773168 512-byte hardware sectors (500108 MB)
    [  643.880275] sd 8:0:0:0: [sde] Write Protect is off
    [  643.880282] sd 8:0:0:0: [sde] Mode Sense: 08 00 00 00
    [  643.880285] sd 8:0:0:0: [sde] Assuming drive cache: write through
    [  643.880292]  sde: sde1
    [  643.884366] sd 8:0:0:0: [sde] Attached SCSI disk
    [  643.884424] sd 8:0:0:0: Attached scsi generic sg5 type 0
    [  644.405240] EXT3 FS on sde1, internal journal
    [ 1083.809695] EXT3 FS on sde1, internal journal
    
    Kluczowa jest linia:
    [  643.880292]  sde: sde1
    
    Wskazujaca ze powinnismy montowac urzadzenie /dev/sde1.
    Uwaga! Dobrze jest sprawdzic czy aby to 'sde' jest tym czego sie spodziemy, widac ze jest to dysk 500G a z ostatnich linii wynika ze jest on sformatowany jako EXT3 (userzy windy winni tu widziec NTFS/FAT32/...).
    Dla potwierdzenia mozna jeszcze probowac listowac po UUID'zie:
     ls -al /dev/disk/by-id/    
    
    Tu widac nazwy dyskow (niemal handlowe), ale nazwy USB sa zakrywane.
    lub
    
     ls -al /dev/disk/by-label/
    
    Tu czesto nie podaja wszystkiego.
    lub
    
     ls -al /dev/disk/by-path/  
    
    To nic nie wnosi.
    lub
    
     ls -al /dev/disk/by-uuid/
    
    Tutaj podawane sa informacje o UUID'ach.
    
    2.Tworzymy miejsce gdzie podmontujemy dysk:
     mkdir /home/user/twoj_dysk_usb
    
    3.Montujemy dysk
     sudo mount /dev/sde1 /home/user/twoj_dysk_usb/ -o rw,nosuid,nodev,uhelper=hal
    
    4.Ustalamy prawa dostepu
     sudo chown user.user /home/user/twoj_dysk_usb/
    

  • Jak pod linux'em podmontowac zasoby Windows'a (Uwaga! wczesniej trzeba je udostepnic!) Jezeli pracujesz pod Knoppix wpisz (przypadek bardzo ogolny, nie zawsze dziala):
    sudo mkdir /mnt/smb
    sudo mount -t smbfs -o username=userid //192.168.1.22/shareid /mnt/smb
    Gdzie:
    userid  - nazwa usera jako kto bedziesz podlaczal zasob
    shareid - nazwa zasobu jaki podlaczasz
    
    UWAGA!!!
    Jezeli na dysku sa duze pliki (>2G) to sambe trzeba o tym uprzedzic wydajac nieco zmodyfikowane polecenie:
    ...
    sudo mount -t smbfs -o username=userid,lfs //192.168.1.22/shareid /mnt/smb
    
    Jezeli pracujesz pod Ubuntu (przypadek gdy powyzsze nie zadzialalo):
    sudo apt-get install smbfs
    sudo mkdir /mnt/smb
    sudo smbmount //192.168.1.22/shareid /mnt/smb -o username=userid
    
    Jezeli chcesz odmonotowac zasob:
    sudo smbmount /mnt/smb
    

  • Jezeli chcesz aby zasob byl montowany automatycznie (stacje bezdyskowe) napisz w /etc/fstab (uwaga jest to jedna linia!):
    //numer_ip/nazwa_zasobu /lokalny/punkt/montowania smbfs                                \
    credentials=/bezpieczne/miecjsce/cred-file,auto,user,uid=nazwa_usera,gid=grupa_usera 0 0
    
    Gdzie:
    numer_ip			-adres IP (lub symboliczny) kompa gdzie sa zasoby domontowywane
    nazwa_zasobu 			-zasob udostepniony na powyzszym kompie
    /lokalny/punkt/montowania 	-loklane miejsce gdzie zasob zdalny bedzie montowany
    /bezpieczne/miecjsce/cred-file	-plik z informacjami jako kto i z jakim haslem montowac zasob na zdalnym kompie
    nazwa_usera			-lokalna nazwa usera dla ktorego dolaczamy zasoby
    grupa_usera			-lokalna nazwa grupy usera dla ktorego dolaczamy zasoby
    
    przykladowa zawartosci /bezpieczne/miecjsce/cred-file:
    username=username
    password=password
    
    Powyzsze informacje dotycza informacji o userze na zdalnym kompie, 
    dobrze jest by ten plik na loklanym kompie, mial prawa ustawione tak:
    chmod 600 /bezpieczne/miecjsce/cred-file
    chown nazwa_usera.grupa_usera /bezpieczne/miecjsce/cred-file
    
    Odtad za kazdym uruchominiem systemu bedziesz mial podmontowany w: /lokalny/punkt/montowania, 
    zasob na kompie numer_ip.
    
  • Jezeli chcesz podmnotowac cos uzywajac CIFS'a napisz:
    mount.cifs //numer_ip/zasob /mnt/smb -o user=jako_kto
    
    Gdzie:
    //numer_ip/zasob - na jakiej zdalnej maszynie (IP) jest dany zasob
    /mnt/smb         - gdzie na loklanej maszynie podmontowac
    jako_kto         - jakiego user'a na zdalnej maszynie uzyc (uwaga 
                       zaraz po wydaniu polecenia system zapyta o haslo na 
                       zdalnej maszynie)
    
  • Jezeli chcesz podmnotowac cos uzywajac Web-DAVFS'a, napisz [zgodnie z: WebDAV mounting under Linux]:
    sudo mount.davfs http://numer_ip/webdav/zasob/ /mnt/davfs -o rw
    
    Gdzie:
    http://numer_ip/webdav/zasob - na jakiej zdalnej maszynie (IP) jest zasob DAVFS
    /mnt/davfs       - gdzie na loklanej maszynie podmontowac
    
    UWAGA!!!
    Jezeli podczas kopiowania pliki 'plik' zobaczysz napis: 
    mv: nie można utworzyć zwykłego pliku `/mnt/davfs/plik': Błąd wejścia/wyjścia
    
    Wykonaj nastepujace czynnosci:
    -Odmontuj zasub 
    -Zmien jako ROOT w '/etc/davfs2/davfs2.conf'
    linie z 'use_locks' na:
    ...
    use_locks       0
    ...
    -Ponownie podmontuj zasob - powinno pomoc (BTW: A co robi ta opcja???)
    

  • Jak "podmontowac" zasoby dostepne pod shell'em na innej maszynie uzywajac SSHFS:
    sudo apt-get update
    sudo apt-get install sshfs
    mkdir ~/sshfs
    sshfs user@numer_ip:/gdzie/sobie/chcesz/ ~/sshfs
    
    UWAGA:
    user			- nazwa usera na kompie 'numer_ip'
    numer_ip                - czyli gdzie w ip ten komp sie znajduje
    /gdzie/sobie/chcesz/    - czyli zasob jaki pragnisze w kompie 'numer_ip' podmontowac
    
    Nie zapomnij w debiano podobnych systemach zainstalowac sshfs'a (czasami 
    jest to nieco zawile gdy np.: w kernelu nie ma obslugi userspace filesystem)!
    
    dodatkowo jezeli wywolasz:
    ssh-copy-id user@numer_ip
    
    to system na ktorym pracujesz wykona wygeenrowanie klucza publicznego i wrzuci 
    go do listy kluczy 'zaufanych' na maszynie 'numer_ip'. 
    Co do zaufania/bezpieczenstwa podanej metody uwierzytelniania, sam czytelniku 
    rozważ czy jest tego warta.
    
  • Jak "podmontowac" zasoby dostepne pod shell'em na innej maszynie uzywajac SSHFS ale z nietypowymi ustawieniami portu SSH:
     sshfs user@numer_ip:/gdzie/sobie/chcesz/ /mnt/sshfs -o port=12345
    
    UWAGA:
    user			- nazwa usera na kompie 'numer_ip'
    numer_ip                - czyli gdzie w ip ten komp sie znajduje
    -o port=12345           - tu podaje inny numer portu SSH 
    /gdzie/sobie/chcesz/    - czyli zasob jaki pragnisze w kompie 'numer_ip' podmontowac
    
    Nie zapomnij w debiano podobnych systemach zainstalowac sshfs'a (czasami 
    jest to nieco zawile gdy np.: w kernelu nie ma obslugi userspace filesystem)!
    
  • Jak "podmontowac" zasoby dostepne pod shell'em na innej maszynie uzywajac SSHFS (jezeli nie ma dostepnego sshfs'a):
    modprobe fuse
    mount.fuse sshfs#user@numer_ip:/gdzie/sobie/chcesz/ /mnt/sshfs/ -o rw -o port=22
    
    UWAGA:
    >modprobe fuse		- czasami nie jest on na stale wkompilowany
    user			- nazwa usera na kompie 'numer_ip'
    numer_ip                - czyli gdzie w ip ten komp sie znajduje
    /gdzie/sobie/chcesz/    - czyli zasob jaki pragnisze w kompie 'numer_ip' podmontowac
    
  • Jak "podmontowac" zasoby dostepne pod shell'em na innej maszynie uzywajac SSHFS z uwzglednieniem praw dowstepu zwyklego usera (uzytkownik bedzie mial taka nazwe a jego uid i gid to 1000):
    mdkri /home/user/sshfs
    sshfs -o allow_other,default_permissions -p 2222 user@numer_ip:. /home/user/sshfs -o idmap=user -o uid=1000 -o gid=1000
    
  • Jak "podmontowac" dysk z windows'ow (partycje NTFS'owe) z mozliwoscia zapisu
    (uwaga!!! wymaga: kernela >2.6.20, fuse i nadaj jest uznawany za niebezpieczny - moze uszkodzic dysk z NTFS'em):
     mount -t ntfs-3g /dev/sdc1 /mnt
    
  • Jak zestawic polaczenie via SSH (TUNEL) z innym SSH (nawet gdy "zlosliwy" admin nie wpuszcza tej uslugi - tu portu 1234, lub nie chce wystawic kompa z taka usluga na ataki z zewnatrz -> bardziej logiczne):
      ssh -p 2222 user_on_komp_B@nazwa_kompa_B -L 1234:nazwa_kompa_A:1234
    
    Gdzie:
    nazwa_kompa_A 	-ten komp ktory ma "server" SSH na porcie 1234 a ktorego 
                     osbluge chcemy przejac (taka maszyna ma z reguly prywatne IP, 
                     np.: 192.168.1.6) - ten komputer staje sie koncowka tunelu
    nazwa_kompa_B 	-nazwa kompa z reguly widocznego z kazdego miejsca w sieci 
                     a ktory ma byc wejsciem do tunelu na porcie o numerze 1234
                     (Uwaga! Z reguly publiczny IP przez wielu dostawcow internetu 
                     zmienia sie codziennie nawet gdy router/modem jest caly czas 
                     podlaczony do dostawcy, musisz wiec skorzystac z uslug 
                     np.: DynDNS/NoIP, lub wykorzystac trik z adresem IP dolaczanym 
                     do email'a wysylanego z takiej sieci - popatrz na naglowki 
                     wiadomosci email wysylanych z tej siec)
    user_on_komp_B  -nazwa usera na kompie B 
    2222            -numer portu na jakim 'nazwa_kompa_B' nasluchuje na SSH (typowo 
                     jest to 22)
    
    Nie zapomnij na 'nazwa_kompa_B' o wpisaniu do /etc/ssh/sshd_config następujcych linii:
      AllowTcpForwarding yes
      PermitTunnel yes
      PermitOpen nazwa_kompa_A:1234
    
    Po czym na 'nazwa_kompa_B' jako root wykonaj (można inaczej ale tak nie przerwie istniejaych połaczeń):
    /etc/init.d/ssh restart 
    
    BTW: mozna zapisać - jezeli chcemy zezwolic na wiecej tuneli (opisy oddzielone spacjami):
      PermitOpen nazwa_kompa_A:1234 nazwa_kompa_C:5678
    
    UWAGA!!! 'nazwa_kompa_A' - musi być zrozumiała przez maszynę 'nazwa_kompa_B',
    z reguły używanie numerów IP rozwiazuje ten problem.
    A jak na 'nazwa_kompa_B' łaczymy się z 'nazwa_kompa_A':
      ssh -p 1234 user_on_komp_A@127.0.0.1
    
  • Jak pobrac SVN poprzez SVN+SSH cos z kompa A ktory ma serwer SSH na porcie 2222 to wpierw zestaw tunel:
    ssh -L 22:nazwa_kompa_A:2222 user_on_komp_B@nazwa_kompa_B
    
    a potem mozesz sciagac SVN'y:
    svn checkout svn+ssh://user_on_komp_B@127.0.0.1/home/miejsce_gdzie_jest_svn
    
    UWAGA!!!
    Oddtad zmiana sciagnietej zawartosci musi byc uaktualniana poprzez ten sam tunnel (svn bedzie probowac wykonywac update na kompie 127.0.0.1!)
  • Jak pobrac cos z uzyciem SCP ale nie za szybko:
     scp -l 100 plik_do_skopiowania user_on_komp_B@nazwa_komp_B:sciezka
    
    Gdzie: -l 100 - to limit w Kbit/sec sciezka - miejsce do skladowania pliku na 'nazwa_komp_B'

  • Jak wrzucic w tlo tunel wykreowany via ssh:
    ssh -f -N -L 5900:nazwa_kompa_A:59000 -p 2234 user_on_komp_B@nazwa_kompa_B
    
    Uwaga! Proces idzie w tlo, i aby zerwac polaczenie - trzeba poznac PID procesu tego polaczenia i wywolac:
    ps aux | grep "ssh -f -N -L 5900:nazwa_kompa_A:59000 -p 2234 user_on_komp_B@nazwa_kompa_B"
    
    Tyle ze powia sie dwa wyniki (lub wiecej), mozna jednak probowac wywolac tak:
    ssh -f -N -L 5900:nazwa_kompa_A:59000 -p 2234 user_on_komp_B@nazwa_kompa_B ; pgrep -f 'ssh.*-f -N -L'
    
    I teraz po zalogowaniu powinnismy odstac PID procesu ssh tak wywolanego - tylko ze taki tunnel zestawiamy na na dluzszy czas wiec pewnie zapomnimy jaki to PID byl.
  • Jak dostac sie do mysql'a (dzialajacy na kompA nie widocznym ze swiata) ktory nie wpuszcza na niczym innym niz 127.0.0.1, przy pomocy kompB jako serwera widocznego ze swiata:
    w jednym oknie:
    >ssh -p 2222 -L 2200:kompA:2222 user_kompB@kompB
    
    w drugim oknie:
    >ssh -p 2200 -L 3306:127.0.0.1:3306 user_kompA@127.0.0.1
    
    w trzecim oknie
    >mysql -h 127.0.0.1 -u root -p
    
  • Jak zmniejszyc wielkosc plikow z danymi, zajmowanych przez baze danych MySQL, zakladam ze pliki te rozrosly sie (np.: dodano tabele, potem ja usunieto - ale rozmiar plikow z danymi pozostal bez zmian) nie poruszam tu zagadnien komperasji danych zapisanych przez baze danych.
    UWAGA!!! Operacje te sa dosc niebezpieczne i moga bezpowrotnie usunac nieraz bardzo wazne informacje! Autor tego tekstu nie bierze odpowiedzialnosci za efekty przeprowadzenia opisanych swzczegolnie tych operacji

    1.Utworz zrzutu bazy danych (uwaga prosi o haslo root'a do bazy danych):
    mysqldump -u root --password --all-databases -c > mysql_dump.sql
    
    2.zatrzymaj serwer MySQL
    3.usun w nim plik (uwaga moze zakonczyc sie tragicznie, lepiej na pewien czas zmienic tylko ich lokalizacje lub ich nazwe):
    cd ...do miejsca gdzie skladowane sa pliki z bazami danych (to moze zalezec od konfiguracji)
    rm ib_logfile0
    rm ib_logfile1
    rm ibdata1
    
    4.wznow dzialanie serwer MySQL
    5.odtwarz bazy danych (uwaga prosi o haslo root'a do bazy danych):
    mysql -u root --password -p -h 127.0.0.1 mysql < mysql_dump.sql
    
    I powinienes miec nieco mniejsza zajetosc dysku.
  • A może irytuje Ciebie ze po podlaczeniu sie klientem VNC do Twojej ulubionej dystrybucji niektore okienka pojawiaja sie nieco dziwnie, czasami widac z nich tylko jeden element i trzeba nimi "potrzasnac" aby pokazaly sie cale?
    Winny jest VINO na serwerze do ktorego sie podlaczas, a tak naprawde zle ustawiona domyslna opcja uruchamiania czegos co nazywa sie "xdamage" (co to jest???).
    Aby ja wylaczyc napisz, z linii polecen polaczenia ssh (po to uzywam ponizej "DISPLAY=:0.0"):
    DISPLAY=:0.0 gsettings set org.gnome.Vino disable-xdamage true
    
    No a teraz uruchom ponownie komputer i dzialaj z nieco szybszym VNC.
    Mozna jeszcze wylaczyc tapete w pulpicie (czasami tez przyspiesza):
    DISPLAY=:0.0 gsettings set org.gnome.Vino disable-background true
    
    Uwaga! Najnowsza wersja klientow TightVNC 2.8.5 [http://www.tightvnc.com/] wspiera nieco szybsza prace z VNC serwerem na Ubuntu/....
    Jedyne co trzeba uruchomic poza wlaczeniem dzielenia sie pulpitem to odpowiednie szyfrowanie (uruchom to w lini polecen uruchomionych X'ow, na komputerze dzielacym sie pulpitem):
    gsettings set org.gnome.Vino require-encryption false 
    

  • Jak za pomoca programu PUTTY (windows) zalogowac się do systemu Linux (ssh) bez przechdzenia prze okienka Putty z wykorzystaniem zapamietanych wczesniej sesji (tu: jest to np.: user@jakis_komp):
     putty -load user@jakis_komp
    
    UWAGA!!! dziala tylko w wersji nie portable!!!
  • A jak za pomoca programu 'plink' z pakietu PUTTY (windows) wykonac zdalnie polecenie z wykorzystaniem zapamietanych wczesniej sesji (jak wyzej):
     plink -load user@jakis_komp "uname -a"
    
    A dostaniejsz informacje o systemie UWAGA!!! dziala tylko w wersji nie portable!!!
  • Gdybys chcial wykonac jakies polecenie jako root zdalnie za pomoca tego 'plink' to uzyj:
     plink -t -load user@jakis_komp "sudo whoami"
    


  • Jak z diff'owac i potem jak z patch'owac:
    diff -purN plik.c nowy_plik.c > plik_zmian
    
    a potem mozna odtworzyc nowy plik (w aktualnym katalogu jest plik.c):
    
    patch -p0 < plik_zmian
    

  • Jak diff'owac cale drzewa katalogow:
    diff -purN ./ver1/ ./ver2/ > plik_zmian
    
    a potem aby odtworzyc z wersji ./ver1/ wersje ./ver2/ wykonaj
    
    cd ./ver1/
    patch -p0 < plik_zmian
    
    Aby na koniec w ./ver1/ miec to co bylo w ./ver2/. UWAGA!!! Jezeli pliki w ./ver1/ i w ./ver2/ byly tekstowymi ale zapisanymi pod dos'em to mozesz miec problemy - patch bedzie sie gubic - w rezultacie moze wykonac operacje nie poprawnie.
  • Jak diff'owac wlasne zmiany (odtwarzanie pliku przez patch'a): 1.Zakladam ze posiadasz plik 'plik_zmian' z informacjami co i jak trzeba utworzyc (wygenerowany przez diff - jak patrz pkt. 2) o tresci:
    diff -Naur ./pusty_katalog/test.c ./A2/test.c
    --- ./pusty_katalog/test.c	Thu Jan  1 00:00:00 1970
    +++ ./A2/test.c	Thu Mar 24 14:44:29 2011
    @@ -0,0 +1,6 @@
    +#include <stdio.h>
    +
    +int main(void){
    + printf("Start\n");
    + return 0; 
    +}
    
    Ten plik 'plik_zmian' mozesz przeslac koledze aby ten odtworzy Twoje pliki u siebie (lacznie z katalogami) za pomoca wywolania polecenia:
     mkdir temp 
     cd temp 
     patch -p0 <../plik_zmian
    
    Po powyzszej operacji powstanie katalog ./A2/ z plikiem test.c
    2.Pytanie jak utworzyc plik 'plik_zmian'? Najprosciej (zakladajac ze w ./A2/ sa umieszczone pliki i katalogi z trescia do odtwarzania):
     diff -Naur ./pusty_katalog/ ./A2/ >plik_zmian
    
  • W przykladach jak poslugiwac sie mechanizmami diff/patch:
    1.Tworzymy w pocie i znoju orginalne pliki:
    >joe ./ver1.00/main.c
    
    o tresci:
    int funkcja(int);
    int main(void){
     int i=1234;
     funkcja(i);
     return 0;
    }
    
    2.Ale jak zwykle po czasie zauwazamy zo cos mozna jeszcze poprawic (tutaj dotyczy to porzadkowania plikow naglowkowych): >joe ./ver2.00/main.c
    #include "include/utils.h"
    int main(void){
     int i=1234;
     funkcja(i);
     return 0;
    }
    
    Dodatkowo tworzymy katalog:

    >mkdir -p ./ver2.00/include/

    I plik naglowkowy:
    >joe ./ver2.00/include/utils.h
    int funkcja(int);
    
    Czyli w sumie sama kosmetyka.

    3.Wylaniamy roznice:

    >diff -ruN ./ver1.00 ./ver2.00 >jak_zmieniac_oryginaly

    4.W nowym miejscu (np.: na innym kompie)
    Tu warto zauwazyc ze innym programistom wystarczy wyslac plik: 'jak_zmieniac_oryginaly' i versje 1.00 projektu a reszte sami sobie odtworza.
    Wiec jak odtwarzamy oryginalne pliki:

    >mkdir -p ./temp/ver1.00
    >cp ./ver1.00/main.c ./temp/ver1.00
    >cp jak_zmieniac_oryginaly ./temp

    5.Odtawarzamy nowsze wersje zrodel - wlasciwe patch'owanie:
    >cd ./temp
    >patch -p0 < jak_zmieniac_oryginaly

    6.W katalogu:
    ./temp/ver1.00/
    pojawia sie zmienione wersje (czylito co bylo w ver2.00)

  • Jak efektywnie archiwizowac drzewa katalogow:
    rsync -arvzP ./katalog_k1/ ./katalog_k2/
    
    gdzie:
    ./katalog_k1 - to miejsce zrodlowych plikow (katalog)
    ./katalog_k2 - to miejsce docelowe plikow (katalog istniejacy)
    

  • Jak efektywnie archiwizowac drzewa katalogow (z czyszczeniem docelowego miejsca):
    rsync -arvzP --delete ./katalog_k1/ ./katalog_k2/
    
    gdzie:
    ./katalog_k1 - to miejsce zrodlowych plikow (katalog)
    ./katalog_k2 - to miejsce docelowe plikow (katalog istniejacy)
    
    UWAGA!!! Tutaj zawartosc ./katalog_k2/ stanie sie wierna kopia 
    zawartosci ./katalog_k1, czyli co wczesniej bylo w ./katalog_k2/
    zostanie skasowane!
    

  • Jak efektywnie archiwizowac drzewa katalogow z miedzy dwoma maszynami wykorzystujac tunel utworzony na bazie SSH
    rsync -arvzP -e "ssh -p 22" ./katalog_k1/ user@komp:/katalog_k2/
    
    gdzie:
    22           - numer portu na jakim na 'komp' nasluchuje sshd
    ./katalog_k1 - to miejsce zrodlowych plikow (katalog)
    user         - konto usera na 'komp' 
    ./katalog_k2 - to miejsce docelowe plikow, katalog istniejacy na
                   'komp' u uzytkownika 'user' (z reguly jest to 
                   finalnie katalog: /home/user/katalog_k2/)
    
    UWAGA!!! 1)Taka metoda jest efektywniejsza niz metoda lokalna z montowaniem poprzez sambe lub nawet sshfs dyskow drugiego kompa, co wynika z tego ze na 'komp' pracuje czesc rsync'a i w ten sposob czesc pracy wykonuje 'komp' a czesc lokalna maszyna, w przypadku montowania i tak wszsytkie dane musza splynac do lokalnej maszyny (nawet gdy dane sa synchronizowane). 2)Obie maszyny musza wspierac kodowanie UTF-8 - szczegolnie wazne gdy nazwy zawieraja znaki specyficzne dla jezyka polskiego - inaczej moze sie okazac ze albo rsync nie moze otworzyc pliku (wypisujac komunikat ze plik jest w uzyciu -?) albo zamienia nazwy plikow w taki sposob ze zamiast literek z ogonkami sa znaki podkreslenia.
    Gdybys nie chcial draznic admina sieci, mozesz ograniczyc transfer:
    rsync -arvzP --bwlimit=300 -e "ssh -p 22" ./katalog_k1/ user@komp:/katalog_k2/
    
    Gdzie: --bwlimit=300 oznacza transfer w KBytes/sec
  • Mozesz tez bardziej ogolnie, uzywajac narzedzia trickle, sterowac szybkoscia pobierania i wysylania:
     trickle -u 10 -d 20 rsync -arvzP -e "ssh -p 22" ./katalog_k1/ user@komp:/katalog_k2/
    
    Gdzie: 10 - szybkosc "wkladania" do zdalnego hosta w KB/sec 20 - szybkosc "pobierania" z zdalnego hosta w KB/sec
  • Jak poradzic sobie z rsync'ime odmawiajacym wspolpracy - problem z opcja '-a' (system nie moze poradzic sobie z zachowaniem atrybutow plikow):
    rsync -lDrvP ./katalog_k1/ ./katalog_k2/
    
  • Jak ominac niektore katalogi podczas kopiowania rsync'im:
    rsync -lDrvP ./katalog_k1/ ./katalog_k2/ --exclude=nazwa_katalogu/nazwa.*
    Uwaga!
    System ominie pliki pasujace do wzroca, czyli beda to pliki np.:
    ./katalog_k1/nazwa_katalogu/nazwa.txt
    
    Sugestia dotyczy formy dopasowywania - doslownie dopasowuje sie nazwy do wzorca
    a nie sciezki absolutne, czy relatywne (przyjrzyj sie co rsync wypisuje na konsole
    podczas pracy - to sa jego nazwy pikow).
    
  • Jak wypisac zawartosc miejsca z ktorego chcemy kopiowac dane, dla sprawdzenia czy wszystko narzedzie potrafic bedzie skopiowac:
    rsync -r --list-only ./Katalog_Do_Listowania/
    
  • Jak uzywac rsync pod Windows, zakladam kopiowanie z C:\Programs\Thunderbird\Profiles\ceqpaw7a.default do E:\temp\kopia_poczty
    rsync -arvzP /cygdrive/c/Programs/Thunderbird/Profiles/ceqpaw7a.default/ /cygdrive/e/temp/kopia_poczty/
    
    Tlumaczenie nazw plikow - jasne ze proste ;->
  • Jak kompilowac tak aby wyniki prezentowane byly na konsoli oraz zachowywane byly w pliku
    make 2>&1 | tee plik_wynikowy
    
    Gdzie: 
    plik_wynikowy - efekt wypisywany na konsole
    

  • Jak pod linux'em wyniki pracy jakiegos programu (tutaj: make), przekierowac strumienie STDOUT i STDERR do jednego pliku:
    make >log_file 2>&1
    
    Gdzie:
    log_file - nazwa pliku do jakiego maja byc wpisywany dane z obu strumieni
    

  • Co w pliku Makefile oznaczaja okreslone symbole specjalne - majac zapis:
      all: main.h main.c
    
    oznacza:
    $@ - odpowiada targetowi czyli slowu 'all'
    $< - odpowiada pierwszej zaleznosci ("dependence") czyli main.h
    $^ - odpowiada wszystkim zalezonosciom czyli main.h i main.cp
    
  • Jak w systemie Linux dokonac procesu kompilacji via make, tak aby bylo wiadac co i jak bylo robione:
    make SHELL='sh -x'
    
  • Jak zmierzyc szybkosc danego urzadzenia (zapisu w aktualnym katalogu - wymaga 100MB wolnego miejsca)
    time dd if=/dev/zero of=./test_file bs=1M count=100
    

  • Jak zmierzyc szybkosc ogolna urzadzenia (operacje w pamieci, miejmy nadzieje ze system nie zauwaza iz sa to puste operacje)
    time dd if=/dev/zero of=/dev/null bs=1M count=100
    

  • Jak sprawdzic jakich biliotek wymagaja dane programy
     ldd $(which wget; which mc)
    
  • Jak na plytach EPIA (i nie tylko) wykorzystac wbudowany kontoler magistrali I2C:
    1.Sciagamy:
    wget http://dl.lm-sensors.org/i2c-tools/releases/i2c-tools-3.0.1.tar.bz2
    
    2.Rozpakowujemy 
    tar jxvf i2c-tools-3.0.1.tar.bz2
    
    3.Kompilujemy 
    cd i2c-tools-3.0.1 
    make 
    
    4.Testujemy dzialanie
    4.1.Ladujemy modul kernela (uwaga! moze nie byc wkompilowana obsluga i2c 
    lub jego elementow w kernel - wtedy trzeba sie niezle napocic!)
    sudo modprobe i2c-dev
    
    4.2.Detekujemy jakie sa obecne magistrale
    sudo ./tools/i2cdetect -a 0
    
    Po zatwierdzeniu [Y] otzrmyamy wynik skanowania magistrali:
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- 69 -- -- -- -- -- --
    70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    
    Co oznacza ze dysponujemy urzadzeniami: 0x50 - prawdopodobnie 
    pamiec i 0x69 - prawdopodobnie zegar RTC.
     
    4.3.Odczytujemy zawartosc pamieci urzadzenia o adresie 0x50
    sudo ./tools/i2cdump 0 0x50
    
    Co moze po zatwierdzeniu [Y], dac podobny wynik:
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
    00: 80 08 07 0d 0a dd dd dd dd dd dd dd dd dd dd dd    ........xxxxxxxx
    10: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF    ................
    ....
    e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
    f0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa    AAAAAAAAAAAAAAAA
    
    Jak latwo zauwazyc specjalnie zmodyfikowano ze wzgledow 
    bezpieczenstwa zawartosc fragmentu powyzszej pamieci.
    
  • Jak odczytac czas z zegara czasu systemowego X1205 podlaczonego do magistrali I2C:
    1.Odkryj jaki adres ma ten uklad na magistali
      i2cdetect -y 0
    
    Wynik moze byc taki
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- UU
    70: -- -- -- -- -- -- -- --
    
    Znaleziono jedna pozycje "UU" - co oznacza ze jest na magistrali I2C jedno urzadzenie i cos je uzywa (np.: modul kernela, choc w tym przykladzie nie jest tak).
    2.Sprawdzmy jak nazywa sie urzadzenie na tej magistrali (co raportuje /sys/), uirzadzenie zgodnie z pkt.1 mialo adres 0x6f
    cat /sys/bus/i2c/devices/0-006f/name
    
    Jezeli pojawila sie nazwa 'x1205' to odnalezlismy czego szukalismy i mozemy odczytac czas za pomoca systemu /sys/:
    cat /sys/bus/i2c/devices/0-006f/rtc\:rtc0/time
    
    System zwroci, np.:
    07:25:02
    
  • Jak dowiedziec sie jakie pamieci masz zainstalowane:
    1.Sciagasz plik decode-dimms.pl ze strony (znasz link???):
    http://www.lm-sensors.org/browser/i2c-tools/trunk/eeprom/decode-dimms.pl?rev=5011
    
    2.Ladujesz modul
    sudo modprobe eeprom
    
    3.Uruchamiasz plik decode-dimms.pl
    chmod +x decode-dimms.pl
    sudo ./decode-dimms.pl
    
    i masz raport podobny do tego:
    Decoding EEPROM: /sys/bus/i2c/drivers/eeprom/0-0050
    Guessing DIMM is in                             bank 1
    
    ---=== SPD EEPROM Information ===---
    EEPROM Checksum of bytes 0-62                   OK (0x8B)
    # of bytes written to SDRAM EEPROM              128
    Total number of bytes in EEPROM                 256
    Fundamental Memory type                         DDR SDRAM
    SPD Revision                                    0.0
    
    ---=== Memory Characteristics ===---
    Maximum module speed                            400MHz (PC3200)
    Size                                            256 MB
    tCL-tRCD-tRP-tRAS                               3-3-3-8
    Supported CAS Latencies                         3, 2.5, 2
    Supported CS Latencies                          0
    Supported WE Latencies                          1
    Minimum Cycle Time (CAS 3)                      5 ns
    Maximum Access Time (CAS 3)                     0.65 ns
    Minimum Cycle Time (CAS 2.5)                    6 ns
    Maximum Access Time (CAS 2.5)                   0.7 ns
    Minimum Cycle Time (CAS 2)                      7.5 ns
    Maximum Access Time (CAS 2)                     0.75 ns
    
    ---=== Manufacturing Information ===---
    Manufacturer                                    Kingston
    Manufacturing Location Code                     0x04
    Part Number                                     K
    Manufacturing Date                              2005-W32
    Assembly Serial Number                          0xXXXXXXXX
    
  • Jezeli masz watpliwosc jak dzialaja ciapki: ` ' ", to spojrzyj na ten skrypt:
    #!/bin/sh
    
    echo "Wywolales mnie z parametrem: $1"
    if [ `date | awk '{ print $1}'` = "$1" ]
    then
     echo "Dzis jest data taka jaka podales w parametrze '$1'"
    fi
    
    Wyja¶nienie:
    1.Zapis '{ print $1}' - jest przekazywany w calosci jako parametr dla awk
    2.Zapis `date | awk ...` - jest wywolaniem zewnetrznych plecen
    3.Zapis '$1' - wypisze zawartosc zmiennej $1 (argument wywolania calego
    skryptu) jako wartosci, np.: jezeli $1 bedzie XXXX to wypisze 'XXXX'
    3.Zapis "Dzis jest .....'$1'" - jest wypisaniem pewnego komunikatu ale z
    wstawieniem zawartosci zmiennej $1 udekorowanej w znaki ''
    

  • Jak ustalic strefe czasowa dla polecenia date:
     export TZ=UCT
     date
    

  • Jak zobaczyc date/czas w wlasnym formacie (godzina:minuty.sekundy):
     date +"%H:%m.%S"
    
  • Jak zmienic na ciekawa postac znak zachety (podaje user, maszyne, czas, aktualny katalog i znak '$':
     export PS1="\u@\h[`date +"%H:%M`]:\W\$"
    
    lub (gdy bash sie czepia):
     export PS1="\u@\h[`date +\"%H:%M\"`]:\W\$"
    

  • Jak zrobic boot'owalny plik ISO (obraz do ewentualnego pozniejszego wypalenia), na bazie obrazu dyskietki:
    mkisofs -r -b boot.img -o test.iso dir_set/
    Gdzie:
    test.iso    - nazwa pliku wynikowego ISO
    -b boot.img - informacja ze plik 'boot.img' jest obrazem dyskietki 
                  boot'owalnej
    dir_set/    - nazwa katalogu z tym co ma byc w takim ISO dodane (w 
                  sumie tylko 'boot.img')
    
  • Jak zrobic boot'owalny pendrive z pliku ISO np.: debiana, upewnij sie ze pendrive to np.: /dev/sda (pomocny jest 'fdisk -l'):
      cp debian.iso /dev/sda
      sync
    
    W sumie proste!?
  • Jak zsynchronizowac zegar systemowy z wzorcem czasu (uwaga! pamietaj o ustawieniu przesuniecia czasu w danej maszynie - inaczej zawsze bedziesz miec staly offset w ustawieniu czasu).
    Dodatkowo uzycie pool.ntp.org, wspiera balansowanie ruchu w poli serwerow ntp.
    ntpdate pool.ntp.org
    
  • Jak ustawic zegar RTC z czasem z NTP (np.: ustawionym przez ntpdate)
    ntpdate pool.ntp.org && hwclock --set --date="`date`"
    
  • Jak ustawic system do pracy w danej strefie czasowej (tu dla Warszawy):
    sudo mv /etc/localtime /etc/localtime.old
    sudo ln -s /usr/share/zoneinfo/Europe/Warsaw /etc/localtime
    
  • Jak wypisac liste adresow MAC naszych kart sieciowych:
    /sbin/ifconfig | grep "eth[0-9]" | sed -e 's/^eth.*HWaddr //'
    
  • Ale jak obejrzec parametry kart sieciowych nieco szerzej i nowoczesniej:
    ip addr show
    
  • Ale jak obejrzec parametry IP gdy na pokladzie nie masz ani polecenia ip ani ifconfig (uwaga nie bardzo rozumiem dlaczego kazdy proces ma wlasny wpis w PROCFS ale dziala):
    awk '/32 host/ { print f } {f=$2}' <<< "$(
    pokaze:
    
    10.0.1.7
    127.0.0.1
    10.0.1.7
    127.0.0.1
    
    Ale to juz wiecej niz nic.
  • Jak ustawic statyczne IP dla karty np.: eth0, bazuje na wpisach w pliku /etc/network/interfaces, zaklada sie hipotetyczne ale dość czeste ustawienia sieci:
    	auto eth0
    	iface eth0 inet static
    		address 192.168.1.3
    		netmask 255.255.255.0
    		network 192.168.1.0
    		broadcast 192.168.1.255
    		gateway 192.168.1.1
    		dns-nameservers 8.8.8.8 4.4.4.4
    		up route add 192.168.1.1 dev eth0
    		up route add default gw 192.168.1.1
    
  • Jak wypsac jednym "ciurkiem" caly plik.xml usuwajac wszelkie informacje takiej jak konce lini, tabulacje i spacje:
    cat plik.xml | tr -d '\r\n\t '
    
  • Jak odczytac jaki UUID (Universally Unique Identifier) maja dyski w systemie - metoda 'ls':
    ls -l /dev/disk/by-uuid/
    
    metoda 'vol_id':
    sudo vol_id /dev/sda1
    
    metoda 'blkid':
    sudo blkid /dev/sda1
    
  • Jak rozlaczyc sie z serwerem i pozostawic jakas prace wykonujaca sie dalej:
    screen wget http://gdzies.domena/cos
    
    lub prosto (gdy chcesz miec cala powloke do pracy):
    screen 
    
    Teraz mozesz sie rozlaczyc (ale nie wpisuj 'exit' tylko zerwij polaczenie, w putty wystarczy nacisnac 'X' na gorze okienka). Za jakis czas (jaki?) polacz sie z tym samym kompem i wypisz:
    screen -ls
    
    A zobaczysz (o ile screen sie nie wywali):
    There is a screen on:
            24633.pts-0.jakis_komp (Detached)
    1 Socket in /var/run/screen/S-user.
    
    i mozesz sie podlaczyc do tego "screen'a":
    screen -r 24633
    
    lub (niektore systemy w taki sposob nie pozwola):
    screen -r 24633.pts-0.jakis_komp
    
    lub (niektore systemy moga wymagac tej wersji):
    screen -D -r '24633.pts-0.jakis_komp'
    
    Gorzej jezeli zobaczysz:
    There are screens on:
            24682.pts-2.jakis_komp (Detached)
            24633.pts-0.jakis_komp (Detached)
    2 Sockets in /var/run/screen/S-user.
    
    Dobra zatem praktyka jest zawsze kontrolowanie po wejsciu z jakim screen'em sie zlaczyla dana sesja.
  • Jak uzyc TMUX'a - przydatny aby zostawic procesy w tle 1.Przypadek - uruchamiamy proces (tu MC) i chcemy gdy zerwie sie polaczenie nadal polaczyc sie z programem MC w jego aktualnym stanie sprzed przerwania:
    tmux new-session -s mc /usr/bin/mc
    
    Tu zrywa sie polaczenie (lub naciskamy jednoczesnie CTRL+B oraz doslownie na ulamek sekundy potem wciskamy klawisz d) - wiec logujemy sie i wydajemy polecenie:
    tmux ls
    
    Widac (dla przykladu):
    mc: 1 windows (created Mon Sep 30 12:06:05 2024)
    ...
    
    Z powyzszego wiemy, ze punktem polaczenia jest "mc:" wiec wydajemy polecenie:
    tmux attach -t mc
    
    I dalej mozesz obslugiwac MC w stanie gdy został przerwany.
  • Gdy niekiedy trzeba zrobic cos jako 'root' mozesz uzyc polecenia sudo albo:
     su -c "whoami"
    
    Oczywiscie zostaniesz poproszony o haslo 'root'a oraz polecenie "whoami" tutaj jest tylko na pokaz, mozesz uzyc ciekwszej konstrukcji:
     su -c "/bin/bash"
    
    Jezeli masz program /bin/bash to zaczenisz po podaniu hasla pracowac w powloce bash jako root.
  • Jak wykonac serie polecen (czy nawet caly skomplikowany skrypt) na komputerze A bedac zalogowanym na komputerze B: 1.Na komputerze B utworz skrypt lub przynajmniej plik z poleceniami, np.:
     uname -a
     ps aux
    
    Wykonaj na komputerze B polecenie:
     cat ./script.txt | ssh user@adres_kompa_A "/bin/bash"
    
    A na ekranie B zobaczysz wynik dzialania polecen: uname i ps, na komputerze A
  • Jak obejrzec jak dany proces zostal wywolany, a raport dzialania polecenia `ps aux` nie miesci sie w calosci na ekranie, przyklad dla procesu numer 1726 - mozesz wybrac dowolny inny:
     cat /proc/1726/cmdline | tr "\000" " "
    

  • Jak uzywac GIT'a, wpierw zainicjuj struktury:
     cd miejsce_gdzie_masz_projekt_do_zassania_przez_gita
     git init
    
  • Dodawanie plikow do repozytorium (wszystko w bierzacym katalogu i pod katalogach):
     git add .
    
  • Dodawanie pojedynczych plikow do repozytorium :
     git add ./nazwa_katalogu/nazwa_pliku
    
  • Wrzucenie zmian:
     git commit
    
  • Jak dodawac i wrzucac jednym ruchem:
     git commit -a
    
  • Jak obejrzec status:
     git status
    
  • Jezeli zobaczysz na consoli cygwina napis "You have some suspicious patch lines", oznacza on ze cygwinowa/win32 wersja git'a zle traktuje pliki, jedyne co nalezy zrobic to wyedytowac plik: .git/hooks/pre-commit, w katalogu projektu i wykomentowac:
     	    if (/\s$/) {
     		bad_line("trailing whitespace", $_);
     	    }
    
  • Jak odszukac kto i kiedy wlozyl pierwsza wersje pliku np.: main.c
     git log --diff-filter=A -- main.c
    
  • Jak odszukac kto i kiedy modyfikowal plik np.: main.c
     git log --diff-filter=M -- main.c
    
    Uwaga!!! podanie zamiast main.c napisu **main.c moze generowac troche dziwne wyniki - podajac liste wszystkich 'commit'ow w ktorych dodano takowy plik, ale nie podajac gdzie takowe pliki sie znajduja.
  • Jak zobaczyc jakie pliki zostaly zmienione w ostatnim commit'ie:
  • git diff HEAD^ HEAD --name-only
    
  • Jak zobaczyc jakie pliki, kiedy i przez kogo zostaly zmieniane:
  • git whatchanged
    
  • Jak podejrzec nazwy usunietych plikow (wczesniej zamoitowanych):
    git log --diff-filter=D --summary
    
  • Jak podejrzec co bylo modyfikowane w kolejnych commit'ach:
    git log --oneline -M --stat --follow -- *
    
  • Jak otagowac aktualny stan i wypchnac go do zdalnego repozytorium:
    git tag v0.1.2 -a -m "komentarz to tagu" 
    git push origin v0.1.2
    
    Gdzie: v0.1.2 - to oznaczenie tagu
  • Jak usunac okreslony tag (tu: v0.2):
    git tag -d  v0.2
    
  • Jak pobrac (linia z clone) okreslony tag (tu jest to v0.1.2):
    git clone https://jakis.serwer.z.naszym.repozytorium/nazwa.naszego.repozytorium
    git checkout tags/v0.1.2
    
  • Jak proszuac sie po tagach - krok 1, poznanie listy tagow:
    git tag
    
    Chcemy wrocic do okreslonego tagu - tu v0.1:
    git checkout tags/v0.1
    
  • Jak wylistowac tagi z ich komentarzami:
    git tag -n9
    
  • Jak uzywac GIT'a z linii polecen, bazujacego na polaczeniu SSH bez podawania hasla za kazdym razem (ostrzegam rozwiazanie potencjalnie niebezpieczne - zwlaszcza gdy klucz wycieknie): 1.generujemy klucz prywatny i publiczny
    ssh-keygen -t rsa -b 4096  -f ~/.ssh/moje_repo_pod_gitem
    
    2.kopiujemy klucz publiczny na serwer:
    ssh-copy-id -i ~/.ssh/moje_repo_pod_gitem -p 2222 nazwa_uzytkownika@adres_komputera_z_repozytorium_git
    
    3.edytujemy plik .git/config
    [core]
    ...
    	sshCommand = "ssh -i ~/.ssh/moje_repo_pod_gitem"
    [remote "origin"]
    	url = ssh://nazwa_uzytkownika@adres_komputera_z_repozytorium_git:2222
    ...
    
    I podczas wydawania polecen: git pull, git push nie musisz podawac hasla. Uwaga! W sieci istnieje podejscie gdzie podaje sie haslo (tu: moje_haslo_do_tego_kompa) jawnie wprost do pliku .git/config lokalnego repozytorium:
    ...
    url = ssh://nazwa_uzytkownika:moje_haslo_do_tego_kompa@adres_komputera_z_repozytorium_git:2222
    ...
    
    Mocno przestrzegam przed stosowniem tego podejscia!!!
  • Jak przelaczyc sie na inny branch:
    git checkout experiments
    
  • a jak wrocic do glownego branch'u:
    git checkout main
    
  • a skad wiedziec jakie branch'e sa dostepne:
    git branch
    
  • Jak przelaczyc sie na wybrany commit - etap I, sprawdzenie jaki ma identyfikator:
    git log --oneline
    
    Zwroci (przykladowo):
    eba2d73 (HEAD -> master, origin/master, origin/HEAD) Wersja finalna
    b7f841b Wersja nie optymalna 
    e1f092c Inicjacja systemu
    
    Tutaj zamiast HEAD chcemy obejrzec comit opisany jako "Wersja nie optymalna" wiec jego skrót to b7f841b i taki pobieramy:
    git checkout b7f841b 
    
    Teraz system poda nam po wydaniu polecenia git log --oneline taki raport:
    b7f841b Wersja nie optymalna 
    e1f092c Inicjacja systemu
    

  • Jak zobaczyc jakie komputery w domowej sieci sa podpiete (i odpowiadaja na ping!)
    UWAGA!!! metoda dosc wolna, w sieci jest wiele programow niezle radzacych sobie z problemami wyszukania kompow w sieci:
     for i in `seq 1 254`; do ping -c 1 192.168.1.$i; done | grep "bytes from"
    
    Lub wersja podajaca same numerki IP:
     for i in `seq 1 254`; do ping -c 1 192.168.1.$i; done | grep "bytes from"  | cut -f 1 -d":" | cut -f 4 -d" "
    
    Lub wersja podajaca nazwy domenowe:
     for i in `seq 1 254`; do ping -c 1 192.168.1.$i; done | grep "bytes from" | \
     cut -f 1 -d":" | cut -f 4 -d" " | xargs -n 1 nslookup  | grep "name" | grep -v "nameserver" | cut -f 2 -d"="
    

  • Jak dowiedziec sie gdzie kompilator zaglada podczas swojej pracy:
     gcc --print-search-dirs
    
  • Jak dowiedziec sie z czego korzysta gcc podczas kompilacji i linkowania:
     gcc -Wl,-t
    
  • Z jakich makr wbudowanych korzysta gcc:
     gcc -E -dM - < /dev/null
    
  • Jak skompilowac plik main.c i podpatrzec jaki jest produkt w ASMie (nie zapomnij napisac pliku: main.c):
     gcc -g main.c -o main
     objdump -S main
    
  • Jak wygenerowac zaleznosci dla danego pliku (przydatne przy tworzeniu makefile'owych zaleznosci):
     gcc -M main.c
    lub 
     gcc -MM main.c ---> to samo ale bez plikow "systemowych"
    lub
     gcc -M -MG main.c ---> to samo ale gorliwiej 
    lub 
     gcc -M -MT '$(target)' main.c ---> niemal gotowe dla makefile'a
    lub
     gcc -Wl,-y,printf main.c ---> pozwala sledzic symbole i kto w jakim pliku je implementuje
    
  • A jak zobaczyc gdzie system szuka bibliotek (inspiracja filami Jacob'a Sorber):
     ld --verbose | grep SEARCH_DIR | tr ";" "\n" | cut -f2 -d"=" | cut -f1 -d"\""
    
  • Jak zobaczyc jakie 'smieci' generuje podczas pracy gcc:
     gcc -save-temps main.c
    
  • Jak "wewnetrzne zycie" aplikacji i jej interakcja z systemem operacyjnym (z serii: tylko dla twardzieli):
     strace /bin/true
    lub
     strace ./twoja_aplikacja argument_wywolania_nr_1 argument_wywolania_nr_2
    
  • Jak w aplikacji pisanej w C przechwycic sygnaly (np.: CTRL-C):
    #include <stdio.h>
    #include <signal.h>
    
    void myhandler(int s){
     fprintf(stderr, "End of the aplication (%d)\n", s);
     exit(0);
    }
    
    int main(void){
     struct sigaction m;
     m.sa_handler=myhandler;
     m.sa_flags=SA_RESTART;
     sigaction(SIGINT, &m, NULL);
    
     for(;;); //wait for CTRL-C
     return 0;
    }
    
  • Jak w aplikacji pisanej w C przechwycic sygnaly od alarmu (nieco inaczj niz powyzej):
    #include <stdio.h>
    #include <signal.h>
    
    void signal_handler_CTRL_C(int sig){
     printf("Zlapalem sygnal od CTRL+C\n");
     signal(SIGINT, SIG_DFL);
    }
    
    void signal_handler_ALARM(int sig){
     printf("Zlapalem sygnal od alarmu\n");
    }
    
    int main(void){
     printf("Test\n");
     signal(SIGINT, signal_handler_CTRL_C);
     signal(SIGALRM, signal_handler_ALARM);
    
     alarm(10);
    
     while(1){
       printf("Czekaj spie\n");
       sleep(1);
     }
    
     return 0;
    }
    
  • Jak w aplikacji pisanej w C przechwycic sygnaly od alarmu (znowu nieco inaczj niz powyzej):
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/time.h>
    #include <signal.h>
    
    #define ALARM_PERIOD        2000
    
    struct itimerval t;
    
    void alaram_callback(int sig_num){
        printf("Alarm was fired!\n");
        
        setitimer(ITIMER_REAL, &t, NULL);    
        signal(SIGALRM, alaram_callback);
    }
    
    int main(int argc, char *argv[]){
        t.it_value.tv_sec=ALARM_PERIOD/1000;
        t.it_value.tv_usec=(ALARM_PERIOD%1000)*1000;
    
        setitimer(ITIMER_REAL, &t, NULL);
        signal(SIGALRM, alaram_callback);
    
        for(;;)
            sleep(1);
        
        return 0;
    }
    
  • Jak w aplikacji napisanej w C wylaczyc buforowanie danych wypisywanych przez funkcje fprintf() - co z reguly owocowalo nieco ospalym umieszczniu danych w pliku wyjsciowym, niech main.c wyglada tak:
    #include <stdio.h>
    
    int main(void){
      int i;
      setbuf(stdout, NULL);
      setbuf(stderr, NULL);
      for(i=0; i<10000; i++){
        fprintf(stdout, "To chcemy aby zaraz po wywolaniu tej linii trafilo na STDOUT!\n");
        fprintf(stderr, "Podobnie i ta linia ale do STDERR!\n");
      }
      return 0;
    }
    
    po kompilacji:
    gcc main.c -o main
    
    Wywolujemy:
    ./main 2>error.txt 1>standard.txt
    
    Nie zdziw sie jezeli nawet bez wywolan setbuf(), program bedzie dzialal ok. To rozwiazanie jest pomocne tylko wtedy gdy fprintf() jest wywolywany stosounkowo rzadko, wtedy to system probuje buforowac jego wywolania i wprowadzac wyniki wiekszymi paczkami.
  • Jak szybko wygenerowac plik binarny o tresci podanej z linii polecen (kluczem jest to ze podaje sie dane tekstowo a otrzymuje plik binarny o bajtach wypelnionych zgodnie z tesktowo podanymi wartosciami):
    1.Utworz plik main.c, o tresci:
    #include <stdio.h>
    int main(int argc, char **argv){
        int i;
    
        if(argc<2){
            fprintf(stderr, "Usage: \n%s <bytes....>\n", argv[0]);
            exit(2);
        }
    
        for(i=1; i<argc; i++)
            fprintf(stdout, "%c", strtol(argv[i], NULL, 0));
    }
    
    Teraz skompiluj go:
     gcc main.c -o brd
    
    I mozesz uzyc np. tak:
     ./brd 0x41 0x42 0x20 0x61 0x62 > out.bin
    
    A otrzymasz w pliku out.bin ciag: AB ab UWAGA! Nie zalecam wypisywac wszystkich wartosci na konsole czesto skutkuje to problemami, stad wpisanie do pliku.
  • Jak kompilowac duze projekty korzystajace z wielu zagniezdzonych makefile i podejrzec co i kidy jest wywolywane:
      make MAKE_VERVBOSE=1  SHELL="/bin/bash -x" -d  target
    

  • Jak obejrzec wygenerowany plik z man'em, gdy automatycznie narzedzie systemowe nie potrafii znalezc danego pliku z man'em (przydatne gdy np.: skompilujesz jakis program w czego wyniku powstana pliki man, ale automat ich nie zainstaluje w domyslne miejsce - bo akurat tego nie chciales, lub robiles cross-kompilator):
     gtbl ./xscale-elf-gdb.1 | geqn | gtbl | groff -Tascii -man | more
    

  • Jak 'zdebugowac' program nad ktorym pracujemy na zdalnej maszynie:
    1.Maszyna gdzie jest program wykonywany (jakis win32 i cygwin) o IP 192.168.1.2:
     gdbserver localhost:60000 test.exe
    
    2.Maszyna na ktorej bedzie interfejs debugera:
     ddd --debugger /usr/bin/i686-w64-mingw32-gdb test.exe \
     --eval-command="target remote 192.168.1.2:60000" \
     --eval-command="break main" \
     --eval-command="continue"
    
    Zalozenia:
    a)plik 'test.exe' skompilowano z opcja kompilacji '-g' i skopiowano na obie maszyny, a miejsca wywolań powyzszych narzedzi 'widza' te pliki.
    b)maszyna 2. ma zaintalowany ddd i gdb ale w wersji 'cross', dla debiana to bylo by instalowane przez:
     sudo apt-get update ; sudo apt-get install ddd gdb-mingw-w64
    
    c)obie maszyny widza sie via TCP/IP
    d)program test.exe powstal ze zrodel w C, ktore zawieraja funkcje 'main' (w wywolaniu ddd widac ze na funkcji main jest ustawiany 'break point').
  • Jak sprawic aby system dla user'a (dowolnego) chcial wykonac polecenie 'su -':
     chmod +s /bin/su
    

  • Jak w skrypcie BASH'a wykonac polecenie zewnetrzne (tu: make) i zbadac czy wykonane zostalo prawidlowo (czyli: czy powloka znalazla takie polecenie lub czy samo polecenie zakonczylo prace z pozytywnym rezultatem):
     #!/bin/bash
     make -C katalog_z_plikiem_makefile
     if [ $? != 0 ]; then	
            echo "Polecenie zakonczono niepowodzeniem!"
     	exit 1
     fi
    
    UWAGA!!!
    Ten skrypt nie rozroznia czy bledem jest:
    -brak polecenia 'make' w sciezce
    -brak katalogu 'katalog_z_plikiem_makefile'
    -brak pliku 'makefile' w katalogu 'katalog_z_plikiem_makefile'
    -czy bledna skladnia pliku 'katalog_z_plikiem_makefile/makefile'

  • Jak w skrypcie BASH'a wykonac test czy 'jakis_plik' istnieje a jezeli jest to wywoalc 'zrob_cos':
      #!/bin/bash
      [ -f /jakis_plik ] && zrob_cos 
    
    Inne wazne testy BASH'a:
    -aplik istnieje
    -bplik istnieje i jest blokowym plikiem specjalnym
    -cplik istnieje i jest plikiem znakowym specjalnym
    -distnieje i jest katalogiem
    -eplik istnieje
    -fplik istnieje i jest zwyklym plikiem ('regular')
    -gplik istnieje i jego SGID jest ustawiony
    -hplik istnieje i jest linkiem symbolicznym
    -pplik jest laczem nazwanym
    -rplik istnieje i mozna czytac plik
    -splik istnieje i ma rozmiar wiekszy niz zero
    -uplik istnieje i jego SUID jest ustawiony
    -wplik istnieje i mozna zapisywac do pliku
    -xplik istnieje i można plik wykonać
    -Nplik istnieje i byl zmieniany od czasu jego ostatniego odczytu
    jakis_plik1 -nt jakis_plik2jakis_plik1 jest nowszy od jakis_plik2
    jakis_plik1 -ot jakis_plik2jakis_plik1 jest starszy od jakis_plik2
    jakis_plik1 -ef jakis_plik2jakis_plik1 i jakis_plik2 odnosza sie do tego samego urzadzenia i ma ten sam 'inode'
    =sprawdza czy wyrazenia sa rowne
    !=sprawdza czy wyrazenia sa rozne
  • Jak w jednej linii (BASH'a) wykonać jedno polecenie a po nim drugie bez zwazania na pomyslnosc pierwszego:
     polecenie1 ; polecenie2
    
  • Jak w jednej linii (BASH'a) wykonać jedno polecenie a po nim drugie i ile pierwsze wykonanlo sie pomyslnie:
     polecenie1 && polecenie2
    
  • Jak w jednej linii (BASH'a) wykonać jedno polecenie a po nim drugie gdy pierwsze zakonczylo sie niepowodzeniem:
     polecenie1 || polecenie2
    
  • Jak w BASH'u wykonać jedno polecenie w tle a po nim drugie tez w tle a na koniec zaczekac na oba:
    	polecenie1 &
    	PID_P1=$!
    	polecenie2 &
    	PID_P2=$!
    	wait $PID_P1 $PID_P2
    
  • Jak w BASH'u uruchomic dwa polecenia i gdy trzeba to "ubic" oba via CTRL-C:
    (trap 'kill 0' SIGINT; polecenie1 & polecenie2 )
    
  • Jak w BASH'u uruchomic dwa polecenia i gdy trzeba to "ubic" oba via CTRL-C:
    source polecenie1 >polecenie1.log 2>&1 &
    PID_P1=$!
    source polecenie2 >polecenie2.log 2>&1 &
    PID_P2=$!
    tail -q -f polecenie1.log -f polecenie2.log --pid $PID_P1 --pid $PID_P2 
    wait $PID_P1 $PID_P2
    

  • Jak w debianie uaktywnic operacje 'sudo' dla zwyklych userow (uwaga! tej operacji lepiej nie uaktywniac na waznych serwerach - cytujac autorow sudo: "duza wlaza to duza odpowiedzialonosc!"):
    0.Zmien "sie" na 'root'a - reszta modyfikacji musi byc wykonana z tego konta:
     su -
    
    1.Sprawdz czy jest grupa 'adm':
     cat /etc/group | grep adm
    
    Jezeli jej nie ma (czyli powyzsze nie dalo zadnych wynikow) - to dodaj:
     addgroup adm
    
    2.Dodaj zwyklego uzykownika 'user' do grupy 'adm':
     usermod -G adm -a user
    
    3.Wyedytuj plik '/etc/sudoers' - wylacznie za pomoca:
     visudo
    
    Dodajac w nim wpis:
     %adm ALL=(ALL) ALL
    
    Dodatkowo aby sudo nie zapamietywalo hasel dodaj w linii 'Defaults':
     Defaults        env_reset, timestamp_timeout=0
    
    4.Teraz mozemy przetestowac
     su - user 
     sudo whomai
    
    Wynikiem po podaniu hasla, powinno byc 'root'
  • Jak zdalnie wylaczyc kompB, bedac zalogowanym na innym kompie:
     ssh user@kompB -t "sudo poweroff"
    
    Jak pomajstrujesz przy sudores (powyzej) to zrobisz to bez podawania dwukrotnie hasla.
  • Jak via PuTTY zdalnie wylaczyc kompB, bedac zalogowanym pod windows:
     plink.exe user@kompB -t "sudo reboot"
    
    UWAGA: tu korzystam z sesji podanej wprost, ale jezeli pomajstrujesz z kluczami prywatnymi to moze uzyc sesji jako argumentu:
     plink.exe -load nazwa_sessji -t "sudo reboot"
    

  • Jak sprawdzic jak skonfigurowano RAID'a - jezeli nie wiemy nic o kompie:
     mdadm --detail --scan
    
    Da wynik (lub podobny):
    ARRAY /dev/md0 level=raid1 num-devices=2 UUID=ffffffff:33333333:00000000:11111111
    ARRAY /dev/md1 level=raid1 num-devices=2 UUID=99999999:00000000:cccccccc:22222222
    ARRAY /dev/md2 level=raid1 num-devices=2 UUID=bbbbbbbb:66666666:22222222:33333333
    ARRAY /dev/md3 level=raid1 num-devices=2 UUID=77777777:22222222:aaaaaaaa:44444444
    
    Co oznacza ze mamy 4 macierze, kazda po dwa napedy, i wszystko pracuje w RAID1. (UUID specjalnie zmieniono, ale generalnie sa to znaki ASCII kodujace wartosci HEX'em).
  • Jak sprawdzic konkretne urzadzenie (np.:/dev/md0)
     mdadm --detail /dev/md0
    
    Da wynik (lub podobny):
    /dev/md0:
            Version : 00.90.03
      Creation Time : Tue Jan 1 00:00:01 1970
         Raid Level : raid1
         Array Size : 96256 (94.02 MiB 98.57 MB)
        Device Size : 96256 (94.02 MiB 98.57 MB)
       Raid Devices : 2
      Total Devices : 2
    Preferred Minor : 0
        Persistence : Superblock is persistent
    
        Update Time : Tue Jan  1 00:00:01 1970
              State : clean
     Active Devices : 2
    Working Devices : 2
     Failed Devices : 0
      Spare Devices : 0
    
               UUID : 44444444:33333333:00000000:aaaaaaaa
             Events : 0.74
    
        Number   Major   Minor   RaidDevice State
           0       8        1        0      active sync   /dev/sda1
           1       8       17        1      active sync   /dev/sdb1
    
    Z czego mozna wycyztac miedzy innymi ze /dev/md0 powstalo z polaczenia w maicierz /dev/sda1 i /dev/sdb1.
  • Jak sprawdzic zestaw urzadzen (np.:/dev/md0 + /dev/md1)
    mdadm -Q --detail /dev/md{0,1}
    
  • Jak wypiac i nastepnie skasowac z dysku macierz (UWAGA!!! operacja bezpowrotnie niszczy dane!):
    A)Uruchom system z CD np.: SystemRescueCD - konieczne aby nie bawic sie z problemem automatycznie podmontowanego woluminu
    B)Sprawdz jak sie miewa maciez (czasami moze jej nazwa byc inna niz sie spodziewasz, dodatkowo dowiesz sie jakie dyski w jej sklad wchodza - to jest wazna informacja):
    mdadm --detail /dev/md0
    
    C)Skoro wiesz ze maciez tam jest to mozesz ja zatrzyamc:
    mdadm --stop /dev/md0
    
    D)Na koniec musisz zniszczyc wpisane z dyski informacje o tym ze wspieraja macierz - dla kazdego dysku ktory chesz odzyskac (tu przydaja sie informacje z pkt B.):
    mdadm --zero-superblock /dev/sda
    ...
    

  • Jak wlaczyc system plikow OWFS:
     /opt/owfs/bin/owfs -d /dev/ttyUSB0 /mnt/owfs
    
    UWAGA!!! Zakladam ze masz do kompa podpiety kowerter USB-RS232 (i masz w zwiazku z nim dowiazanie: /dev/ttyUSB0, do ktoregmo masz prawa RW), a do niego od strony portu RS232 podpinasz konwerter RS232-1Wire (na bazie ukladu DS2480). Wiecej infomracji szczegolnie odnosnie budowy konwerterow na WRT54 i 1Wire oraz ogolnie o OWFS lub bezposrednio na stronie OWFS.
  • Jak wogole przygotowac owfs'a aby pracowal:
     apt-get install fuse-utils libfuse-dev libfuse-perl libfuse2
     mkdir owfs
     cd owfs/
     wget http://downloads.sourceforge.net/project/owfs/owfs/2.7p26/owfs-2.7p26.tar.gz?use_mirror=dfn
     tar zxvf owfs-2.7p26.tar.gz 
     cd owfs-2.7p26
     ./configure --enable-owfs --enable-owhttpd
     make
     sudo make install
    

  • Jak zainstalowac gruba gdy sie zgubul a mamy tylko jakas plyte z LIVECD - uwaga! wszystko jako ROOT, dodatkowo jezeli nie jestes pewien co robisz - nie rob tego!: 1.Montujemy dysk (zakladam ze jest to /dev/hda1) na ktorym pragniemy zainstlwoac grub'a
     mkdir -p /mnt/hda1 
     mount /dev/hda1 /mnt/hda1 
    
    2.Zmienamy chroor'a (uwaga! zakladam ze na /mnt/hda1 jest pelen system plikow dla '/'):
     chroot /mnt/hda1 /bin/sh
    
    3.W chroot'owanym srodowisku, uruchamiamy grub'a (zakladam ze sciezki na tym systemie plikow /mnt/hda1 sa ustawione dla chroot'a poprawnie):
     grub --device-map=/boot/grub/device.map 
    
    4.Wydajemy zestaw polecen w powloce grub'a:
     root (hd0,0)
     setup (hd0)
     quit
    
    Po pierwszym grub poinformuje nas jaki na napedzie 'hd0' paartycji '0', znajduje sie system plikow, drugie polecenie rozkarze grub'owi aby zainstlowal sie na dysku 'hd0', a po tej operacji ukaza sie nam raporty o postepie instalacji (wszystko powinno byc konczone z 'successed').
    5.Na koniec wychodzimy z choor'otowego srodowiska (exit).

  • Jak dla plyt (ASRock, ...) sprawic aby Ubuntu zaczelo dzialac w trybie graficznym, edytujemy plik:
    sudo joe /boot/grub/grub.cfg
    
    wpisujac argument 'i915.modeset=0' w linii wywolania kernela np.:
    linux /boot/vmlinuz-2.6.32-24-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro quiet splash i915.modeset=0
    
    BTW:
    Gdybys chcial wylaczyc splasha (graficzny pasek postepu - czasami nie potrzebny) wpisz zamiast 'splash' w tej samej lini 'nosplash'
    BTW2:
    W nowym grubie ustalenie ktora pozycja 'menuentry' jest domyslnie uruchamian (jaki system ma byc boot'owany) ustala linia (tu: czawrta pozycja liczac od 0):
    set default="4"
    
    BTW3:
    Wszystkie powyzsze zmianny sa niezgodne z wpisem z poczatku tego pliku:
    #
    # DO NOT EDIT THIS FILE
    #
    
    Ale jak to obejsc (nowe rozwiazanie jest ponoc zalecane!!!) - prosze bardzo: 1.Wyedytuj plik >sudo joe /etc/default/grub i wpisz w lini: GRUB_CMDLINE_LINUX="" dodatkowy parametr dla kernela: GRUB_CMDLINE_LINUX="i915.modeset=0" 2.Wydaj teraz polecenie: >sudo update-grub 3.Na wszelki wypadek spraw co pkt.2 zdzialalo - powinno sie zmienic w kazdym menuentry dla linux'a:
    linux /boot/vmlinuz-2.6.32-26-generic root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ro quiet splash i915.modeset=0
    

  • Gdy po "udanym" upgrade przestanie tobie dzialac karta WIFI (np.: Atheros z chipsetem AR5007EG):
    Utworz jedno wierszowy plik: /etc/modprobe.d/atheros.conf, o tresci:
    options ath5k nohwcrypt=1
    
    A nastepnie uruchom komputer ponownie.
  • Jak podmontowac "obcy" dysk z LVM'eme: 1.Ustal jaka partycja ciebie interesuje
    sudo fdisk -l 
    
    Disk /dev/sda: xxxx xxxxxxxxxxxxxxxxxx
    ...
       Device Boot      Start         End      Blocks   Id  System
    ...
     /dev/sdaX           xxxx        xxxx    xxxxxxxxx  8e  Linux LVM
    ...
    
    Widac ze LVM jest na partycji X, dysku sda
    2.Zaladuj do kernela obsluge LVM (jezeli potrzeba)
     modprobe dm-mod
    
    3.Za pomoca narzedzi LVM - skanowanie jakie LVM'y sa dostepne:
     vgscan
    
    Co powinno zwrocic cos podobnego do:
     Reading all physical volumes.  This may take a while...
     Found volume group "XXXXXXXXX" using metadata type lvm2
    
    4.Sprawiamy aby kernel mogl uzyc tej partycji LVM:
     vgchange -a y XXXXXXXXX
    
    5.Dokonujemy inspekcji co w takie partycji jest przechowywane:
     lvdisplay
    
    Otrzymamy cos podobnego do:
     --- Logical volume ---
      LV Name                /dev/linvg/rootfs
      VG Name                XXXXXXXXX
      LV UUID                xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxxxx
      LV Write Access        read/write
      LV Status              available
      ...
    
      --- Logical volume ---
      LV Name                /dev/linvg/var
      VG Name                XXXXXXXXX
      LV UUID                xxxxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxxxx
      LV Write Access        read/write
      LV Status              available
      ...
    
    6.Zgodnie z wypisana w pkt.5 zawartoscia dysku wybieramy jeden z logicznych dysko i montujemy go (np.: rootfs)
     mkdir /mnt/linvg/rootfs
     mount /dev/linvg/rootfs /mnt/linvg/rootfs
    
    7.Teraz moze robic dowolna operacje na zawartosci '/mnt/linvg/rootfs'. UWAGA!!! Nie zapomnij odmontowac zasobu na koniec!
  • Jak odzyskac dane z np.: pendrive
  • 1.zrob obraz tego pendrive do pliku:
     sudo dd if=/dev/sdb of=/home/user/obraz_pliku
    
    2.zainstaluj program scalpel i katalog roboczy:
     sudo apt-get install scalpel 
     mkdir -p /home/user/temp_dir
    
    3.skonfiguruj ten program (tutaj bedziemy chcieli odzyskac plik skrytpu bash o orzszerzeniu '.sh'):
     sudo joe /etc/scalpel/scalpel.conf 
    
    Dopisz w ostatniej linii:
     sh y 10000 #!/bin/bash
    
    Co oznacza: 
    	sh 			- szukamy pliku z rozszerzeniem 'sh'
    	y 			- case sensitive
    	10000 		- spodziewany maksymalny rozmiar odzyskiwanego pliku
    	#!/bin/bash - spodziewany naglowek w pliku
    
    4.Wywolaj narzedzie:
     scalpel /home/user/obraz_pliku -o /home/user/temp_dir
    
    Po dluzszej chwili w: /home/user/temp_dir pojawi sie wynik pracy
    UWAGA!
    Zawartosc katalogu: /home/user/temp_dir, musi byc przed wywolaniem programu pusta!
  • Jak odzyskac skasowana omylkowo tablice partycji (co sie czesto zdarza gdy wepniemy dysk i uruchomimy omylkowo Windows'y):
  • 1.Ustal jaki to dysk:
    	sudo fdisk -l 
    
    Ten wypisze, np.:
    	Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
    	255 heads, 63 sectors/track, 121601 cylinders
    	Units = cylinders of 16065 * 512 = 8225280 bytes
    	...
    	Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
    	255 heads, 63 sectors/track, 121601 cylinders
    	Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Ustal ktory z dyskow jest tym na jakim usunieto partycje (pewnie nie bedzie na nim partycji jakich bys sie spodziewal), np.: /dev/sdb
    2.Wykryj jakie partycje na /dev/sdb, moglyby byc: 2.1.Utworz miejsce gdzuie mozna MBR takiego zgadywanego ukladu partycji umiescic
    	mkdir ./temp/
    
    2.2.Uruchom magiczny program ktory znajdzie zguby:
    	sudo gpart -i -W ./temp/mbr_file /dev/sdb
    
    --->tu trzeba potwierdzic pare razy: 'y' (o ile sie zgadzamy)
    2.3.Skoro system znalazl to odtworzmy te partycje:
    	sudo dd if=./mbr_file of=/dev/sdb bs=1 skip=446 seek=446
    	sudo partprobe
    
    Teraz mozesz cieszyc sie tym dyskiem z pelnym opisem partycji, sprawdz:
    	sudo fdisk -l
    
    a ujrzysz (moze wyglada dziwnie ale tak bylo):
    	/dev/sdb1            6323        6930     4883760   82  Linux swap / Solaris
    	/dev/sdb2   *        6931       19457   100623121    c  W95 FAT32 (LBA)
    	...
    
  • Jak skopiowac na drugi dysk uklad partycji (zakladajac ze oba dyski sa indentyczne):
  •     sfdisk -d /dev/sda > opis_tablic_partycji
        sfdisk --force /dev/sdb < opis_tablic_partycji
    
    UWAGA!!!
    -Opcja --force zmusza sfdisk do wykonania operacji, bez niej wykonan zostanie tylko symulacja!!!
    -Przed wykonaniem tej operacji upewnij sie, ze /dev/sda jest wzorcem, a /dev/sdb jest tym dyskiem w ktorym chcemy zmienic uklad partycji (lub w ogole je zalozyc).
    -Jezeli dysk /dev/sdb ma byc w przyszlosci uruchomieniowym - koniecznie zainstaluj na nim bootloader (grub, lilo, ...) powyzsza procedura tego nie zalatwia!
  • Jak sprawdzic jaki typ systemu plikow uzywa dana partycja:
  •   file -s /dev/sda1
    

  • Jak poslugiwac sie VLC:
  • 1.Uruchamianie VLC z linii polecen z aktywacja interfejsu HTTP (zaklada sie ze VLC zostalo zainstlowane z wsparciem dla HTTP oraz ze pliki html dla tego wsparcia sa umieszczone w katalogu /usr/share/vlc/http):
     mkdir -p /var/www/vlc
     cp -a /usr/share/vlc/http/ /var/www/vlc/
     vlc -I http --http-src /var/www/vlc --http-host numer_ip_tego_komputera:8080
    
    Teraz mozesz otworzyc przegladarke WWW i wpisac: http://numer_ip_tego_komputera:8080
    UWAGA!!! Taka metoda nie jest bezpieczna (daje malo kontrolowany dostep do wielu plikow)!!!
  • Jak z komputera A za pomoca SSH uruchomic VLC aby wyswietlal film na ekranie graficznym komputera B:
  • 1.Utworz na komputerze B plik: /home/user/run.sh o tresci:
     #!/bin/bash
     export DISPLAY=:0.0
     vlc moj_ulubiony_film.mp4
    
    2.Nadaj mu prawa do wykonania
     chmod +x /home/user/run.sh
    
    3.A teraz mozesz wlaczyc film zdalnie
     ssh user@numer_kompa_B  /home/user/run.sh
    
    UWAGA: -Jak zapewne czytelniku zauwazyles - brak tu decydowania o tym jaki plik chcesz ogladac, i jak pewne wiesz latwiej to obejsc stosujac interfejs HTTP dolaczany jako usluga do VLC. Proponowane podejscie pokazuje tylko jak zdalnie uruchomic cos wykorzystujacego grafike.
  • Jak z komputera A za pomoca SSH uruchomic VLC aby wyswietlal film na ekranie graficznym komputera B: (prostsze podejscie)
  •  ssh user@numer_kompa_B  DISPLAY=:0.0 vlc moj_ulubiony_film.mp4
    
  • A moze ogladanie filmu w jakosci teksotwej?:
  •  vlc --vout caca moj_ulubiony_film.mp4 
    
  • A moze ogladanie filmu w jakosci teksotwej i interfejsem telnetowym?:
  •  vlc --vout caca *.mp4 -I rc --rc-host 127.0.0.1:12345 2>/dev/null
    
    Teraz mozesz wywolac (na tym samym kompie!!!):
     telnet 127.0.0.1 12345 
    
    I sterowac VLC za pomoca pocen z klawiatury.
  • Jak przekonwertowac material video (MP4) na aduio (MP3) tak aby strumien audio mial przeplywnosc 128Kb/s:
     ffmpeg -i video.mp4 -ab 128k audio.mp3
    
  • Co zrobic gdy podczas konwertowania np.: via VLC w command-line pojawia sie komunikat o nie znalezieniu kodek'a:
    sudo apt-get update 
    sudo apt-get install libavcodec-extra-53 libavcodec52 libavcodec53
    

  • Jak zorganizowac dlugie skrypty w bardziej eleganckie moduly (np.:BASH'a)?:
  • Odpowiedzia jest dzielenie ich w mniejsze pliki. Dla przykladu plik z ustawieniami zmiennych srodowiskowych moglby byc wykorzystywany przez wiele róznych skryptów, nazwijmy go 'ustawienia.sh' i umiescmy go w katalogu '/absolutna_sciezka/', a jego trescia niech bedzie:
    fun1()
    {
        PPATH=/opt/test1
    }
    
    Teraz mozemy w innych skryptach wykorzystywac takie funkcje, np.:
    #!/bin/bash
    . /absolutna_sciezka/ustawienia.sh
    fun1
    echo "PPATH="$PPATH
    

  • Jak umożliwic wysylanie poczty jako 'smarthost': 1.Zmodyfikuj plik '/etc/exim4/update-exim4.conf.conf' do takiej postaci:
    dc_eximconfig_configtype='satellite'
    dc_other_hostnames='nazwa_twojego_komputera.nazwa_twojej_sieci'
    dc_local_interfaces='127.0.0.1' 
    dc_readhost='nazwa.twojego.komputera.w.sieci'
    dc_relay_domains=''
    dc_minimaldns='false'
    dc_relay_nets=''
    dc_smarthost='nazwa_komputera_SMTP::numer_portu'
    CFILEMODE='644'
    dc_use_split_config='false'
    dc_hide_mailname='true'
    dc_mailname_in_oh='true'
    dc_localdelivery='mail_spool'
    
    Gdzie: nazwa_twojego_komputera - musisz ja znac/wpisac nazwa_twojej_sieci - prawdziwa i widoczna na swiecie nazwa twojej sieci, gdy uzywasz kompa za routerem NAT to z reguly jakis DDNS dla niego "utrzymuje" wlasnie te nazwe sieci nazwa_komputera_SMTP - komp ktory przyjmie do Ciebie Twoja poczte i wysle w swiat numer_portu - numer portu na jakim powyzszy komp przyjmuje poczte.
    2.Po powyszszych zmianach uruchom jako root na swoim kompie: update-exim4.conf

  • Jak z pliku tekstowego z trescia: jedna linia jeden IP, sprawdzic jakie numery sa zajete, choc wynik jest nieco rozwlekly:
     cat test.txt | xargs -n 1 ping -c 1 -q
    
  • Jak sprawdzic jakie numery IP sa w danej podsieci (np.: 10.0.1.x) aktywne (nawet gdy ping maja wylaczony!) zakladajac ze interfejs sieciowy do tej sieci to 'eth0':
     for i in `seq 1 254`; do arping -i eth0 -c 1 10.0.1.$i 2>/dev/null | grep ":" ; done
    
    lub (na openwrt):
     for i in `seq 1 254`; do arping -I br-lan -c 1 10.0.1.$i 2>/dev/null | grep ":" ; done
    
    Jezeli chcesz zobaczyc z jakim producentem sa zwiazane numery MAC zajrzyj do IEEE: http://standards.ieee.org/develop/regauth/oui/oui.txt
  • Jezeli powyzsze nie odpowiada bo w sieci gdzie jest malo urzadzen nie widac postepu:
     for i in `seq 1 254`; do echo -n "10.0.1.$i: " ; arping -i eth0 -c 1 10.0.1.$i 2>/dev/null | grep ":" ; test $? -eq 0 || echo " not found" ; done
    
  • Jak sprawdzic jakie numery IP sa w danej podsieci - wersja dla leniwych (pod deb/ubuntu):
    sudo apt-get update
    sudo apt-get install arp-scan
    sudo arp-scan --interface=eth0 --localnet
    
    Czasami skanowanie wymaga podania podsieci tu: 10.0.1.0/24 (np.: gdy Twoje Ra-Pi w dziwny sposob ustawia dla ETH0 wiele IP):
    sudo arp-scan --interface=eth0 10.0.1.0/24
    
  • Jednak gdy nudzi sie Tobie i nie chcesz wywolywać powyzszego dla kazdej sieci z osobna (tam trzeba bylo zmieniac eth0 na inna nazwe). Pewnie super znawcy grep'a zasmieja sie ze taki lajkonik uzywa grep'a tak nie poradnie - kiedys zoptymalizuje to wywolanie:
    echo 'lista=`ip a | grep "^[^digit]:" | cut -f2 -d":" | cut -f1 -d"@" | grep -v "lo" | tr -d "[:blank:]"` ; for i in $lista; do echo "Scan: $i" ; arp-scan -g --interface=$i --localnet | grep -v "Starting arp-scan " | grep -v "datalink type" | grep -v "packets received by filter" | grep -v "Ending arp-scan" | grep -v "^$"; done` | sudo sh
    
    Lub
    sudo bash -c 'lista=`ip a | grep "^[^digit]:" | cut -f2 -d":" | cut -f1 -d"@" | grep -v "lo" | tr -d "[:blank:]"` ; for i in $lista; do echo "Scan: $i" ; arp-scan -g --interface=$i --localnet | grep -v "Starting arp-scan " | grep -v "datalink type" | grep -v "packets received by filter" | grep -v "Ending arp-scan" | grep -v "^$"; done'
    
    Uwazaj na znaki ' i `, w ostatniej lini calosc dla bashowej opcji -c otulaja znaki '.
  • Jak dowiedziec sie jakie serwisy sieciowe sa uruchomione
     sudo netstat -nutlp
    
    gdzie:
    -n - numeryczne przedstawienie numrow portu 
    -u - udp
    -t - tcp
    -l - nasluchujace
    -p - zwroc nazwy powiazanych PID'ow i nazw programow jakie dla nich wywolano
    
    UWAGA! Jezeli wywolasz bez 'sudo' to wynik nie bedzie zawieral 
    nazw PID/Program name, poza tymi jakie wywolujacy user wywolal, 
    np.: jezeli wywolal user: tester, to w kolumnie pojawia sie:
    ...
    tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN     -
    tcp6       0      0 :::5900                 :::*                    LISTEN     5578/vino-server
    ...
    

  • Jak sprawdzic jakie IP ma seria maszyn:
    for i in `printf "%02d " {0..20}; echo`; do echo "pc_name7"$i".moja.siec.pl" ; done | xargs -i ping {} -c 1 | grep icmp_req
    
    Nie naduzywaj tego wywolania - tu najciekawsze jest generowanie ciagu nazw komputerow.
  • A moze uzyc skrypt do szybkiego przeszuknia jakie maszyny sa wlaczone i jakie maja IP [baza: Shantanu Tushar, Sarath Lakshman: "Linux Shell Scripting Cookbook, Second Edition", ISBN 978-1-78216-274-2]:
    #!/bin/bash
    
    LAN_CARD=eth0
    LAN_IP_PREFIX=10.0.1
    
    if [ $UID -ne 0 ];
    then
            echo "Run as root"
            exit 1;
    fi
    
    for ip in $LAN_IP_PREFIX.{1..255} ;
    do
    	(
                    RES=`/usr/sbin/arping -i $LAN_CARD -c 1 $ip 2>/dev/null` ;
                    if [ $? -eq 0 ];
                    then
                            otxt1=`echo $RES | cut -f2 -d" "`
                            otxt2=`echo $RES | cut -f6 -d" "`
                            otxt=`echo $otxt1 $otxt2`
                            echo $otxt
                    fi
    	)&
    	done
    wait
    
  • I jak zwykle mozesz uzyc narzedzia ktore dziala podobnie ale w oparciu o mechanizm "ping":
    fping -a 10.0.1.0/24 -g 2>&1 | grep -v "ICMP Host Unreachable"
    

  • Jak szyfrowac/deszyfrowac pliki
     gpg -c myfile -o myfile.gpg
     rm myfile
     gpg myfile.gpg -o test
    

  • Jak przeskanowac pliki na okolicznosc wirusow:
    1.aktualizacja bazy antywirusow:
     freshclam
    
    2.wlasciwe skanowanie (dosc gadatliwe):
     clamscan -vr /home/user/
    

  • Jak zainstalowac Jave pod ubuntu/debian ale w wersji innej niz domyslna:
    sudo apt-get install openjdk-7-jre
    
    Teraz o ile juz mielismy inna wersje juz zainstalowana, trzeba zmusic system aby uzywal tej ktora wlasnie zainstalowalismy:
    sudo apt-get install openjdk-7-jre
    

  • Jezeli maz dwa/wiecej interfejsow sieciowych, i chcesz aby ruch do danej podsieci szedl przez wybrany interfejs sieciowy zrob:
    sudo route add -net SIEC_A/MASKA_SIECI_A gw ADRES_GATEWAY dev INTERFEJS_SIECIOWY
    
    Gdzie:
    SIEC_A/MASKA_SIECI_A - numer i masak sieci do jakiej chcesz kierowac ruch
    INTERFEJS_SIECIOWY - np.: wlan0 (przydatne gdy wlan0 jest podpiety do Androida a ten przez 3G/4G staje sie dawca internetu)
    ADRES_GATEWAY - numer IP urzadzenia przez jaki ruch ma przechodzic (jezeli INTERFEJS_SIECIOWY to wlan0 i Adnroid jest dawca to jest to jego numer IP
  • W nowszych systemach zalecane jest używanie polecenia ip w miejsce route - oto generyczna składnia, dla dodania trasy do sieci NETWORK/MASK poprzez wezeł GATEWAY_IP:
    sudo ip route add NETWORK/MASK via GATEWAY_IP
    np.:
    sudo ip route add 10.12.0.0/24 via 10.8.1.1
    
    dla dodania trasy do sieci NETWORK/MASK poprzez kartę sieciową DEVICE_NAME:
    sudo ip route add NETWORK/MASK dev DEVICE_NAME
    np.:
    sudo ip route add 10.12.0.0/24 dev tun0
    
    dla dodania domyslnej(!) trasy do sieci NETWORK/MASK poprzez wezeł GATEWAY_IP:
    sudo ip route add default via GATEWAY_IP
    np.:
    sudo ip route add default via 10.8.1.1
    
    dla dodania domyslnej(!) trasy poprzez kartę sieciową DEVICE_NAME:
    sudo ip route add default via {GATEWAYIP}
    np.:
    sudo ip route add default via eth2
    

  • Jak z wielu plikow JPG wygenerowac jeden PDF (choc moze byc problem z kolejnoscia stron):
     convert *.jpg -adjoin output.pdf
    
  • Jak zmienic obrazek na dwu kolorowy:
     convert we.jpg -threshold 90% wy.jpg
    
  • Jak obrazek pociac na dwa fragmenty (ciecie w poziomie w polowie wysokosci):
     convert wejsciowy.jpg -crop 100x50% wyjsciowy
    
    Uwaga!!! Powstana dwa pliki 'wyjsciowy-0' i 'wyjsciowy-1'
  • Jak obrocic obrazek o zadany kat:
     convert we.jpg -rotate 90 wy.jpg
    

  • Jak majac jedna karte ETH pobrac wiele numerow z DHCP serwera (dla testowania czy dziala ok!):
     sudo ip link add dev mojlan0 link eth0 type macvlan
     sudo dhclient mojlan0
    
    Wydaj polecenie 'ifconfig' a zobaczysz nowy interfejs - sprawdz z zewnatrz tej maszyny czy odpowiada na PING.
    Jezeli chcesz aby ta nowa karta miala jakis specyficzny numer MAC, wydaj polecenie (nie zapomnij ze MAC w skali globu musi byc unikatowy!!!):
     sudo ip link add dev mojlan0 link eth0 address 12:34:56:78:9a:bc type macvlan
    
    Jezeli znudzi sie ten interfejs - mozna go usunac:
     sudo ip link delete dev mojlan0
    

  • Jak uruchomic zdalnie za pomoca np.: polaczenia ssh, serever X'ow (dla okna numer 0):
    DISPLAY=:0.0 startx
    
  • Jak sobie do takiego serwera X'ow udroznic server VNC:
    sudo apt-get update 
    sudo apt-get install tightvncserver x11vnc
    tightvncserver
    
  • I jak teraz podlaczyc sie do tego serwera okien poprzez klienta VNC:
    x11vnc -display :0 -usepw -listen 0.0.0.0
    

  • Co zrobic jezeli Twoj klient SSH nie potrafi polaczyc sie z serwerem SSH:
    (zakładam ze problem tkwi w "nie dogadaniu sie kryptograficznym" a nie bledna konfiguracja jako taka
    sudo joe /etc/ssh/sshd_config
    
    I dopisz na koncu pliku linie:
    Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,blowfish-cbc,aes128-cbc,3des-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc
    
    Na koniec zrestartuj SSHD:
    sudo /etc/init.d/ssh restart
    
    UWAGA!!! Nie jestem specem od SSH i kryptografii, wiec ta metoda jest nieco niebezpieczna!
  • Jak sprawdzic jakie vhosts sa aktualnie aktywne via apache:
    apachectl -D DUMP_VHOSTS
    
  • Jak sprawdzic jakie moduly sa aktualnie aktywne via apache:
    apachectl -D DUMP_MODULES
    
  • Jak sprawdzic jakia jest aktualnie aktywna konfiguracja apache:
    apachectl -D DUMP_RUN_CFG
    
    UWAGA! Powyzsze mozna szybciej via polecenie:
    apachectl -S; apachectl -M
    

  • Jak ustawic interfejs wlan (dla systemow korzystajacych z wpa):
    sudo wpa_passphrase "ssid-twojego-wifi" "twoje-sekretne-haslo-do-wifi" >> /etc/wpa_supplicant/wpa_supplicant.conf
    

  • Jezeli Twoj Linux po kazdym restarcie zmienia adres MAC karty sieciowej na losowa wartosc - a nie jest do dla ciebie pozadane - to sprwadz czy masz katalog:
     /etc/NetworkManager/
    
    jezeli tak to wielce prawdopodobne ze NetworkManager zarzadza ta sytuacja i aby niepozadane dzialanie zmienic wykreuje plik (jako root):
     /etc/NetworkManager/conf.d/100-disable-wifi-mac-randomization.conf
    
    i wpisz do niego:
     [connection]
     wifi.mac-address-randomization=1
     [device]
     wifi.scan-rand-mac-address=no
    

  • Jak usunac przeszle ustawienia interfejsu eth0 (np.: gdy najpierw ustawilismy mu jakies IP a potem chcielsmy uzyc dhclient'a):
    ip addr flush dev eth0
    

  • Jak porawdzic sobie z gdy w systemie Linux/Debian brak starych polecen: ifconfig, arp, netstat i innych:
    "ifconfig" - to teraz: "ip a"
    "ifconfig eth0 down" - to: "ip link set dev eth0 down"
    "arp -a" - "ip n"
    "netstat -antlp" - to: "ss -tnlp"
    Inne przyklady znajedziesz w sieci np.: pod deprecated-linux-networking-commands-and-their-replacements

  • Jak odczytac tresc certyfikatu (np.: aby sprawdzic do kiedy jest wazny):
     openssl.exe x509 -in client1.cert -noout -text
    

  • Jezeli brakuje Tobie lsusb/lshw a potrzebujesz odkryc jaki sprzet jest w systemie (postac pozostawia nieco do zyczenia ale "z braku laku i kit dobry"):
     cat /sys/kernel/debug/usb/devices
    

  • Jak uaktualnic extpack w Virtualbox - metoda niezbedna gdy okienko Virtualbox'a odmawia uaktualnienia z malo zrozumialym komunikatem o bledzie.
    1.Odczytaj jaki extpack zainstalowales wczesniej, wydajac polecenie:
      VBoxManage list extpacks
    
    Zwroci cos podobnego do:
      Extension Packs: 1
      Pack no. 0:   Oracle VM VirtualBox Extension Pack
      Version:      6.0.8
      ...
    
    2.Widac ze zainstalowano "Oracle VM VirtualBox Extension Pack" w wersji 6.0.8, odinstaluj go - ale zrob to jako root (sudo tez mozna uzyc):
      su -c "VBoxManage extpack uninstall \"Oracle VM VirtualBox Extension Pack\""
    
    3.Sciagnij najnowszy extpack (odpowiedni do zainstalowanego Virtualbox'a), np.:
      wget https://download.virtualbox.org/virtualbox/6.0.12/Oracle_VM_VirtualBox_Extension_Pack-6.0.12.vbox-extpack
    
    4.Zainstaluj pobrany extpack - ale podobnie zrob to jako root (sudo tez mozna uzyc):
      su -c "VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.0.12.vbox-extpack"
    
    Po powyzszych krokach Virtualbox powienien dzialac.
  • Jak spreparowac plik .htaccess tak aby dany katalog zabezpieczyc przed niepowolanym dostepem (gdy serwer www np.: apache na takie podejscie pozwala):
    Utworz w katalogu chronionym plik .htaccess o tresci:
     AuthUserFile /absolutna/sciezka/do/danego/katalogu/.htpasswd
     AuthName "Restricted Files"
     AuthType Basic
     Require valid-user
    
    Wykonaj z dowolnego komputera z narzedziami apache2 polecenie:
     htpasswd -nb user haslo_user
    
    Gdzie 'user' to nazwa user'a jakiego chcesz wpuscic po wpisaniu hasla: 'haslo_user', program powinien zwrocic cos takiego:
     user:$apr1$kvux4zqt$ioAtV16B38itRFXOedYv51
    
    Te tresc wpisz do pliku: /absolutna/sciezka/do/danego/katalogu/.htpasswd
    Niezapomnij skopiowac plikow .htpasswd i .htaccess do chronionego katalogu na serwerze www.
    I tyle.

  • Jak skopiowac obraz (np.: RaspberryPI) na karte SD (zakladam ze znasz jej urzadzenie np.: /dev/sdd) i ustawic minimalna konfiguracje:
    sudo dd bs=1M if=2020-08-20-raspios-buster-armhf-lite.img of=/dev/sdd conv=fsync status=progress
    sudo sync
    mkdir temp
    sudo mount /dev/sdd1 ./temp
    sudo touch ./temp/ssh
    sudo joe ./temp/wpa_supplicant.conf
    sudo umount ./temp
    
    Uwaga! Zakladam ze tresc pliku 'wpa_supplicant.conf' jestes gotowy dla swojego Access Point'a WIFI ustawic poprawnie.
  • Jak w domyslnej konfiguracji RaspberryPI z userem PI dodac nowego user (tu: userja) przypisanego do tych samych grup co pi: 1.utworz nowego usera:
     sudo adduser userja
    
    2.wygeneruj jakie polecenia dla zmiany grup trzeba wykonac
     id pi | tr "," "\n" | grep -v "pi) gid=1000"  | cut -f2 -d"(" | cut -f1 -d")" | xargs -i echo sudo usermod -a -G {} userja
    
    3.wynik z punktu 2 skopiuj i wklej do wykonania
     sudo usermod -a -G adm userja
     ...
    

  • Jak nagrac plyte CD/DVD z command line w Debian'ie: 1.Instalacja narzedzi
    >apt-get update ; apt-get install inxi wodim
    
    2.Odkrywanie nazw urzadzen:
    >inxi -d
    Drives:    Local Storage: total: 1.82 TiB used: 66.86 GiB (3.6%)
                ...
               Optical-1: /dev/sr0 vendor: hp model: DVD-RAM XXXX dev-links: cdrom,cdrw,dvd,dvdrw
               Features: speed: 48 multisession: yes audio: yes dvd: yes rw: cd-r,cd-rw,dvd-r,dvd-ram
    
    3.Wlasciwe wypalanie ISO (wiemy ze nasz CD/DVD ma nazwe /dev/sr0):
    >wodim -eject -tao speed=2 dev=/dev/sr0 -v -data image.iso
    
  • Jak szybko wylaczyc wszelkie reguly firewall'a (o ile inne metody zawodzia)[!!!!Uwaga zakladam ze wiesz jakie jest grozne - system wpuszcza kazego!]:
    iptables --policy INPUT ACCEPT
    iptables --policy OUTPUT ACCEPT
    
  • Jak usunac wszystkie partycje z dysku (zglasza sie jako /dev/sdc i partycje jako /dev/sdc1, /dev/sdc2) typu Pendrive (UWAGA! autor nie beirze odpowiedzialnosci za skasowanie sobie waznych danych z tego urzadzenia):
    sudo wipefs -f -a /dev/sdc*
    sudo sync
    

    Ostatnia aktualizacja: 2024-09-30