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 FS ExtFAT na pendrive o UUID 5CBD-5401, zakladam ze wykonales: mkdir -p /home/user1/sda_5CBD_5401):
UUID=5CBD-5401 /home/user1/sda_5CBD_5401 exfat user,rw,exec,nofail,gid=user1,uid=user1,umask=0000,noauto 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
Co zrobic aby system nie odrzucal pragnienia wywolania SSH klienta i polaczenia go do serwera SSH
gdy identyfikacja tego serwera sie zmienila (komunikat: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)?
ssh -p 2222 -o "StrictHostKeyChecking no" -o UserKnownHostsFile=NUL user@127.0.0.1
Uwaga! Podejscie ryzykowne - wylacza sprawdzania dosc istotnych elementow protokolu - nie rob
tego na serwerach produkcyjnych.
Powyzsze komunikaty ostrzegawcze wystepuja gdy mamy przekierowania na tym samym porcie a maszyny serwerowe
podpinane do tego portu sie zmienily - podobnie objawiaja sie ataki typu man-in-the-middle.
Co zrobic gdy chcesz sie polaczyc z routerem OpenWRT i skopiowac z jego wnetrza plik
a on przekazuje komunikat
ash: /usr/libexec/sftp-server: not found
Mozna ominac pewne zabezpieczenia i skopiowac plik (tu network z /etc/config/) wydajac polecenie:
scp -O -o HostKeyAlgorithms=+ssh-rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -P 2222 root@127.0.0.1:/etc/config/network .
W powyższym router dziala pod Qemu (testy) na lokalnej maszynie (stad IP: 127.0.0.1),
z przekierowaniem portow 2222 na 22 w wnetrzu Qemu.
Pod Windows także możesz wydać to polecenie ale zamiast UserKnownHostsFile=/dev/null wpisz UserKnownHostsFile=NUL
Uruchomienie Qemu (tu pod Windows) wyglada tak:
qemu-system-x86_64.exe ^
-drive file=openwrt-24.10-snapshot-r28654-d2d9b1eaeb-x86-legacy-generic-ext4-combined-efi.img,id=d0,if=none,bus=0,unit=0 ^
-device ide-hd,drive=d0,bus=ide.0 ^
-netdev user,id=n2,hostfwd=tcp::8000-:80,hostfwd=tcp::2222-:22 ^
-device e1000,netdev=n2,mac=52:54:98:76:54:33
W tym wywołaniu:
openwrt-24.10-snapshot-r28654-d2d9b1eaeb-x86-legacy-generic-ext4-combined-efi.img - obraz z OpenWRT
hostfwd=tcp::8000-:80 oraz hostfwd=tcp::2222-:22 - to przekirowania portow 8000 na 80 i 2222 na 22
Dodatkowo pamietaj ze Qemu emuluje siec w nieco tutaj niezgodny z OpenWRT sposob.
Domyslnie OpenWRT tworzy interfejs br-lan bazujac na karcie eth0, nadajac statyczny numer IP 192.168.1.1.
Aby powyzsze kroki z SCP dzialaly trzeba wejsc w Qemu i zmodyfikowac ustawienia sieciowe zapisujac plik network
w /etc/config tak aby wygladal podobnie to ponizszego:
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'
config interface 'lan'
option device 'br-lan'
option proto 'static'
option ipaddr '10.0.2.15'
option netmask '255.255.255.0'
option ip6assign '60'
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`"
W Windows mozna wydajac ponizsze polecenie zapytac o czas
w32tm /stripchart /computer:pool.ntp.org /samples:1
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 odszukac kto i kiedy dodal(A), zmodyfikowal(M) lub zmienil(T) plik np.: main.c
git log --diff-filter=ATM -- main.c
Inne klucze to:
C - skopiowano,
D - skasnowan,
R - zminiono nazwe,
U - cos opisane jako "Unmerged",
X - cos opisane jako "Unknown",
B - uszkodzone (cos opisane jako Broken).
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:
| -a | plik istnieje |
| -b | plik istnieje i jest blokowym plikiem specjalnym |
| -c | plik istnieje i jest plikiem znakowym specjalnym |
| -d | istnieje i jest katalogiem |
| -e | plik istnieje |
| -f | plik istnieje i jest zwyklym plikiem ('regular') |
| -g | plik istnieje i jego SGID jest ustawiony |
| -h | plik istnieje i jest linkiem symbolicznym |
| -p | plik jest laczem nazwanym |
| -r | plik istnieje i mozna czytac plik |
| -s | plik istnieje i ma rozmiar wiekszy niz zero |
| -u | plik istnieje i jego SUID jest ustawiony |
| -w | plik istnieje i mozna zapisywac do pliku |
| -x | plik istnieje i można plik wykonać |
| -N | plik istnieje i byl zmieniany od czasu jego ostatniego odczytu |
| jakis_plik1 -nt jakis_plik2 | jakis_plik1 jest nowszy od jakis_plik2 |
| jakis_plik1 -ot jakis_plik2 | jakis_plik1 jest starszy od jakis_plik2 |
| jakis_plik1 -ef jakis_plik2 | jakis_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
Bardziej zaawansowane wywołanie (poprzez SSH) programu x11vnc w srodowisku dwu monitorowym:
VNC - wpierw instlacja x11vnc:
sudo apt update
sudo apt install x11vnc
I wlasciwe wywolanie (poprzez SSH):
/usr/bin/x11vnc -display :0 -rfbauth /home/user/.vnc/passwd -clip 1920x1080+2560+0
A jak pobrac liste dostepnych monitorow dla opcji clip (wywolanie via SSH):
DISPLAY=:0.0 /usr/bin/xrandr --listactivemonitors
Opcja DISPLAY=:0.0 jest niemal magiczna - i w typowych konfiguracjach dziala.
Pozostaje jeszcze jak ustawic zawartosc pliku /home/user/.vnc/passwd:
/usr/bin/x11vnc -passwdfile /home/user/.vnc/passwd -storepasswd
Po wydaniu tego polecenia system zapyta nas o haslo (dwa razy):
Enter VNC password:
Verify password:
A nastpenie dla upewnia sie zada pytanie czy cchemy zapisac haslo do tego pliku
Write password to /home/user/.vnc/passwd? [y]/n y
I program poinfomruje nas ze zapisano haslo do pliku:
Password written to: /home/user/.vnc/passwd
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