find -name "*.mp3" | mpg123 -@ -
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').
rsync -auzv --include '*/' --include '*.mp3' --exclude '*' /home/user/media/ /home/user/wsad_dla_mp3_playera/
for i in $(find . -type f); do echo $i; done
for i in $(ls); do du -sh $i; doneAle 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 -hUWAGA! 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 -nKtore pokazuje kolejnosc i wielosc w magicznych jednostkach.
for i in $(echo "bin etc lib opt sys usr boot dev sbin tmp var"); do du -sh $i; done
for i in `seq 1000 1100`; do echo "liczba: "$i; done
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.
for i in $(echo "192.168.88.7" "192.168.88.161" "192.168.88.201"); do ssh pi@$i "sudo shutdown -h now" ; doneWada 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.
seq 1 1023 | xargs printf '0x%04x\n'
>md5sum moj_super_wazny_plik.pdfwygeneruje skrót np.:
43aaecf0c18ecc549b678f01b003a48b *moj_super_wazny_plik.pdf2.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: OKjeż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
echo "c5dad159a2775c687e9281b1a0e586f7471690ae28f2f2282c90e7d59f64273c 2021-05-07-raspios-buster-armhf-lite.zip" | sha256sum -c
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'
date -s '2014-09-19 14:59'
date +"%s"
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.
date -u "+%s_%Y-%m-%d_%H:%M:%S"
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 {}
find . -type f | xargs -0 echo | awk '{ print "/home/user" $0 ""}' | xargs -i md5sum {}
find . -name "*.exe" -type f -print | xargs -i cp -a {} /home/nowa_lokacja
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/{}
find . \( -name "*.doc" -or -name "*.txt" \) -type f
find . -maxdepth 1 -type d
find / -maxdepth 1 -type d | xargs -n 1 du -sh
find /home/ -maxdepth 1 -mindepth 1 -type d | xargs -n 1 du -sh
find . -maxdepth 1 -type d | xargs -n 1 du -sb | sort -n --key=1,10
find . -user `cat /etc/passwd | grep 'user_name' | cut -f3 -d":"`
find . -type f | tr "/" "\\" | sed -e 's/^./Z:\\cos\\gdzies/'
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
z podawaniem tylko nazw plikow | z podawaniem tylko nazw katalogow | |
find / -type f |
find / -type d |
find / -type f -perm /+x
awk '/MemTotal:/ {print($2)}' /proc/meminfo
awk '/MemTotal:/ {print($2/2)}' /proc/meminfo
find . -type d -fprintf /home/user/nazwa_plik 'du -sh %f\n'Po takim poleceniu wypisana zostanie wypisana seria polecen, liczacych wielkosc plikow
find . -type d -fprintf `tty` 'du -sh %f\n'
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 '{}'
cat plik_wejsciowy | perl -e 'while(<>){next if /^\s*\n/; print;}'
cat plik_wejsciowy | perl -e 'while(<>){next if /^\s*#/; print;}'
grep -lr "szukana fraza" path/* gdzie: szukana fraza - czego szukamy - mozemy uzywac wyrazen regularnych path - miejsce przeszukiwania
find . -type f -iname 'makefile' -exec grep -niH 'objdump' {} \; -printUwaga! 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' {} \;
cat plik_jakis | grep -a "szukana fraza"
rpm2cpio jakis rpm | cpio --extract
sudo apt-get install tofrodos cd /usr/bin sudo ln -s fromdos dos2unix sudo ln -s todos unix2dos
dpkg --get-selections > /home/user/lista_paczek2.Na kompie B:
scp user@komp_A:/home/user/lista_paczek /home/user/lista_paczek dpkg --set-selections < /home/user/lista_paczek dselectProste?
sudo apt-get dselect-upgrade
ssh user@kompa_A "dpkg --get-selections" | dpkg --set-selections dselectUWAGA! Zamiast dselect'a mozesz uzyc polecenia
sudo apt-get -u dselect-upgrade
apt-get update --allow-releaseinfo-changeA potem mozna juz jak zwykle wydawac polecenie 'apt-get update'. Uwazaj jednak powyzsze operacje troche moga namieszac w Twoim kompie.
dpkg --print-architectureDla systemów 64 bitowych (zgodnych z X86) wypisany powinien byc tekst:
zcat initramfs_data.cpio.gz | cpio -t
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).
find -depth -print | cpio -o -H newc | gzip > ../plik.cpio.gz
#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 initA teraz tworzymy spakowany plik CPIO:
echo init | cpio -o -H newc | gzip > test.cpio.gzCalosc latwo sprawdzic emulatorem QEMU:
qemu -L . -m 128 -hda null.img -kernel vmlinuz -initrd test.cpio.gzTo 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.
qemu -L . -m 128 -hda null.img -boot d -cdrom cdrom.iso -net nic -net user -redir tcp:8080::80Po 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).
at -f nazwa_programu now + 1 minutes
#!/bin/sh cos_do_zrobienia at -f /home/user/skrypt_at.sh now + 1 minutesGdzie: 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!!!.
/home/user/skrypt_at.shI 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'.
#!/bin/sh cos_do_zrobienia at -f /home/user/skrypt_at.sh now + 1 minutes 2>/dev/null
0-59/20 * * * * user /home/user/skrypt_cron.shJezeli 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
crontab -eA tutaj można postawić pytanie: jak zarchiwizowac to co w moim cronie jest wpisane?crontab -l > plik_z_archiwum_crona.txtA jak takie crontab'y z tego archowum zaladowaccrontab plik_z_archiwum_crona.txtCzyli 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):
tar zcvf plik.tar.gz . uzywasz '.' jezeli pragniesz pakowac aktualny katalog
tar zxvf plik.tar.gz tutaj rozpakujesz do aktualnego katalogu
tar jxvf plik.tar.bz2 tutaj rozpakujesz do aktualnego katalogu
wget -m --no-parent jakis_URL_do_strony_z_http
wget http://www.linux.pruszkowski.net -O - 2>/dev/null | wc -c
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
curl --user name:password http://jakas_tam_strona
cat /etc/passwd | awk -F ":" '{print $1"->"$3}'
tail -f error.log | stdbuf -i0 -o0 grep --line-buffered "Invalid"Wstawienie tuz przed grep:
stdbuf -i0 -o0wylacza buforowanie danych wejsciowych i wyjsciowych.
#!/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 doneJezeli chcesz wykonywac krokowo ten skrypt zmien pierwsza linie na:
#!/bin/bash -xMozesz 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 ...
w pliku inittab odszukaj linie (i zmodyfikuj tak): # What to do when CTRL-ALT-DEL is pressed. ca:12345:ctrlaltdel:/sbin/shutdown -h now
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"; doneUwaga!!! -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'
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)
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
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.
Plik: /etc/sysconfig/network ma zawierac: NETWORKING=yes FORWARD_IPV4=falsePlik: /etc/sysconfig/network-scripts/ifcfg-eth0 (jezeli posiadasz inny interfejs zamien eth0 na cos innego!) ma zawierac: DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp
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)
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
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 crtsctsJezeli chcialbys pokombinowac przy wlaczaniu RTSa i sprwadzaniu CTSa to ponizszy program skampiluj w C: rts_cts.htm
stty rows 32 cols 132A 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'
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
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
tcpdump -i sl0 -l -s 1500 -w - | strings
tcpdump -ni eth0 tcp port 80 and host 192.168.1.2
tcpdump -ni eth0 tcp port 80 and \(host 192.168.1.2 or host 192.168.1.3\)
tcpdump -xX -B 1000 -ni eth0 -s 0 udp port 1234
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!
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!
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/tcpdumpUwazaj jednak bo zostawiasz furtke innym userom, ktorzy jezeli beda nalezac do grupy 'pcap' beda mogli nasluchiwac na caly ruch sieciowy w tej maszynie!
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.
ls -la /sys/class/netNa 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
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 752.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 echo3.Utworz link:
ls -s /etc/rc.d/init.d/rs8ups /etc/rc.d/rc3.d/S09rs8upsUWAGA!
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).
sudo socat TCP-LISTEN:11001 /dev/ttyUSB0,b115200,raw,echo=0
socat TCP-LISTEN:8080,fork,crnl SYSTEM:'printf \"HTTP/1.1 200 OK\\n\\n\"\; cat main.cpp'
python -m SimpleHTTPServer 8080gdybys stosowal wersej 3 Python'a uzyj:
python -m http.server 8080
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; doneTresc serwowanego pliku jest tu trywialna, ale pomysl ze mozna w ten sposob wyciagac cale pliki (np.: /etc/passwd)!
while true; do { clear; netstat -antlp; sleep 10; }; doneGdzie 'clear' na poczatku ulatwia ogladanie, a 'sleep 10' nie da zaglodzic systemu operacyjnego.
KOMP1: sx -X plik_do_przeslania < /dev/ttyUSB0 > /dev/ttyUSB0
KOMP2: rx -X plik_do_przeslania < /dev/ttyUSB0 > /dev/ttyUSB0I po dlugim czasie (zaleznie od wielkosci pliku) przy transferze np.: 9600 plik zostanie przeslany z KOMP1 na KOMP2.
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
dd if=/dev/random of=./test-file bs=1 count=Xa teraz dodajemy "zera":
dd if=/dev/zero of=./test-file bs=1 conv=notrunc seek=X count=Y
dd if=/dev/sda of=/dev/null bs=1m conv=noerror
watch -n 1 du -shUWAGA!!! Nie ustawiaj parametru dla '-n' zbyt malego - system sie nieco zacina (musi non stop cos sprawdzac)!!!
$nazwa='jaka_nazwa' if [! -d $"$nazwa" ]; then mkdir $nazwa fi
grep -ni szukany_tekst `find . -type f -name "*.txt"` lub: find . -name "*" -print0 | xargs -0 grep -ni szukany_tekst
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!!!
smartctl -a /dev/hda
smartctl -t short /dev/sdaTest 'short' trwa krotko, dla pelnego testowania mozna wydac polecenie 'long':
smartctl -t long /dev/sdaDla oby polecen aby zobaczyc postep wydaj polecenie, np.:
smartctl -a /dev/sdaA 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".
watch -n 20 smartctl -l selftest /dev/sda
1.Utworz katalog jako 'user1' i to w jego home, np.: mkdir /home/user1/sda4 2.Wpisz na koncu pliku '/etc/fstab' (jako root!): /dev/sda4 /home/user1/sda4 ext3 user,exec 0 1 lub (dla partycji FAT32 - od tak aby linux i winda widzialy ten sam dysk): /dev/sda4 /home/user1/sda4 vfat user,exec,rw,auto,umask=0 0 0 lub (dla dysku sieciowego): //adres/user_name /home/user/cifs_dysk_sieciowy cifs username=user_name,rw,noauto,uid=_jako_kto_,gid=_jako_czyja_grupa_,dir_mode=0770,user 0 0 {gdzie: adres - adres sieciowy dysku sieciowego user_name - username lub udzial na tym dysku sieciowym cifs_dysk_sieciowy - miejsce gdzie bedzie montowany udzia sieciowy _jako_kto_ - na poczet kogo wykonane bedzie montowanie (typowo: 1000 - ale patrz /etc/passwd) _jako_czyja_grupa_ - na poczet jakiej grupy to montowanie (typowo: 1000 - ale patrz /etc/groups) } 3.Zrestartuj kompa(!) 4.Jako root zmien prawa do nowego punktu montowania: chown user1:user1 /home/user1/sda1 5.I teraz po kazdym reboocie mozesz jako 'user1' cieszyc sie nowym dyskiem
sudo tune2fs -l /dev/sda3
sudo tune2fs -c 60 /dev/sda3lub 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
dmesg | grep sdDostajemy 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 journalKluczowa jest linia:
[ 643.880292] sde: sde1Wskazujaca ze powinnismy montowac urzadzenie /dev/sde1.
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_usb3.Montujemy dysk
sudo mount /dev/sde1 /home/user/twoj_dysk_usb/ -o rw,nosuid,nodev,uhelper=hal4.Ustalamy prawa dostepu
sudo chown user.user /home/user/twoj_dysk_usb/
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 podlaczaszUWAGA!!!
... sudo mount -t smbfs -o username=userid,lfs //192.168.1.22/shareid /mnt/smbJezeli 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=useridJezeli chcesz odmonotowac zasob:
sudo smbmount /mnt/smb
//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.
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)
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???)
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.
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)!
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
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
mount -t ntfs-3g /dev/sdc1 /mnt
ssh -p 2222 user_on_komp_B@nazwa_kompa_B -L 1234:nazwa_kompa_A:1234Gdzie:
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:1234Po czym na 'nazwa_kompa_B' jako root wykonaj (można inaczej ale tak nie przerwie istniejaych połaczeń):
/etc/init.d/ssh restartBTW: mozna zapisać - jezeli chcemy zezwolic na wiecej tuneli (opisy oddzielone spacjami):
PermitOpen nazwa_kompa_A:1234 nazwa_kompa_C:5678UWAGA!!! 'nazwa_kompa_A' - musi być zrozumiała przez maszynę 'nazwa_kompa_B',
ssh -p 1234 user_on_komp_A@127.0.0.1
ssh -L 22:nazwa_kompa_A:2222 user_on_komp_B@nazwa_kompa_Ba potem mozesz sciagac SVN'y:
svn checkout svn+ssh://user_on_komp_B@127.0.0.1/home/miejsce_gdzie_jest_svnUWAGA!!!
scp -l 100 plik_do_skopiowania user_on_komp_B@nazwa_komp_B:sciezkaGdzie: -l 100 - to limit w Kbit/sec sciezka - miejsce do skladowania pliku na 'nazwa_komp_B'
ssh -f -N -L 5900:nazwa_kompa_A:59000 -p 2234 user_on_komp_B@nazwa_kompa_BUwaga! 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.
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
mysqldump -u root --password --all-databases -c > mysql_dump.sql2.zatrzymaj serwer MySQL
cd ...do miejsca gdzie skladowane sa pliki z bazami danych (to moze zalezec od konfiguracji) rm ib_logfile0 rm ib_logfile1 rm ibdata14.wznow dzialanie serwer MySQL
mysql -u root --password -p -h 127.0.0.1 mysql < mysql_dump.sqlI powinienes miec nieco mniejsza zajetosc dysku.
DISPLAY=:0.0 gsettings set org.gnome.Vino disable-xdamage trueNo a teraz uruchom ponownie komputer i dzialaj z nieco szybszym VNC.
DISPLAY=:0.0 gsettings set org.gnome.Vino disable-background trueUwaga! Najnowsza wersja klientow TightVNC 2.8.5 [http://www.tightvnc.com/] wspiera nieco szybsza prace z VNC serwerem na Ubuntu/....
gsettings set org.gnome.Vino require-encryption false
putty -load user@jakis_kompUWAGA!!! dziala tylko w wersji nie portable!!!
plink -load user@jakis_komp "uname -a"A dostaniejsz informacje o systemie UWAGA!!! dziala tylko w wersji nie portable!!!
plink -t -load user@jakis_komp "sudo whoami"
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
diff -purN ./ver1/ ./ver2/ > plik_zmian a potem aby odtworzyc z wersji ./ver1/ wersje ./ver2/ wykonaj cd ./ver1/ patch -p0 < plik_zmianAby 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.
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_zmianPo powyzszej operacji powstanie katalog ./A2/ z plikiem test.c
diff -Naur ./pusty_katalog/ ./A2/ >plik_zmian
>joe ./ver1.00/main.co 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:
int funkcja(int);Czyli w sumie sama kosmetyka.
rsync -arvzP ./katalog_k1/ ./katalog_k2/ gdzie: ./katalog_k1 - to miejsce zrodlowych plikow (katalog) ./katalog_k2 - to miejsce docelowe plikow (katalog istniejacy)
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!
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.
rsync -arvzP --bwlimit=300 -e "ssh -p 22" ./katalog_k1/ user@komp:/katalog_k2/Gdzie: --bwlimit=300 oznacza transfer w KBytes/sec
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
rsync -lDrvP ./katalog_k1/ ./katalog_k2/
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).
rsync -r --list-only ./Katalog_Do_Listowania/
rsync -arvzP /cygdrive/c/Programs/Thunderbird/Profiles/ceqpaw7a.default/ /cygdrive/e/temp/kopia_poczty/Tlumaczenie nazw plikow - jasne ze proste ;->
make 2>&1 | tee plik_wynikowy Gdzie: plik_wynikowy - efekt wypisywany na konsole
make >log_file 2>&1 Gdzie: log_file - nazwa pliku do jakiego maja byc wpisywany dane z obu strumieni
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
make SHELL='sh -x'
time dd if=/dev/zero of=./test_file bs=1M count=100
time dd if=/dev/zero of=/dev/null bs=1M count=100
ldd $(which wget; which mc)
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.
i2cdetect -y 0Wynik 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).
cat /sys/bus/i2c/devices/0-006f/nameJezeli 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/timeSystem zwroci, np.:
07:25:02
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
#!/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 ''
export TZ=UCT date
date +"%H:%m.%S"
export PS1="\u@\h[`date +"%H:%M`]:\W\$"lub (gdy bash sie czepia):
export PS1="\u@\h[`date +\"%H:%M\"`]:\W\$"
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')
cp debian.iso /dev/sda syncW sumie proste!?
ntpdate pool.ntp.org
ntpdate pool.ntp.org && hwclock --set --date="`date`"
sudo mv /etc/localtime /etc/localtime.old sudo ln -s /usr/share/zoneinfo/Europe/Warsaw /etc/localtime
/sbin/ifconfig | grep "eth[0-9]" | sed -e 's/^eth.*HWaddr //'
ip addr show
awk '/32 host/ { print f } {f=$2}' <<< "$( pokaze:10.0.1.7 127.0.0.1 10.0.1.7 127.0.0.1Ale to juz wiecej niz nic.
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
cat plik.xml | tr -d '\r\n\t '
ls -l /dev/disk/by-uuid/metoda 'vol_id':
sudo vol_id /dev/sda1metoda 'blkid':
sudo blkid /dev/sda1
screen wget http://gdzies.domena/coslub prosto (gdy chcesz miec cala powloke do pracy):
screenTeraz 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 -lsA 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 24633lub (niektore systemy w taki sposob nie pozwola):
screen -r 24633.pts-0.jakis_komplub (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.
tmux new-session -s mc /usr/bin/mcTu zrywa sie polaczenie (lub naciskamy jednoczesnie CTRL+B oraz doslownie na ulamek sekundy potem wciskamy klawisz d) - wiec logujemy sie i wydajemy polecenie:
tmux lsWidac (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 mcI dalej mozesz obslugiwac MC w stanie gdy został przerwany.
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.
uname -a ps auxWykonaj 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
cat /proc/1726/cmdline | tr "\000" " "
cd miejsce_gdzie_masz_projekt_do_zassania_przez_gita git init
git add .
git add ./nazwa_katalogu/nazwa_pliku
git commit
git commit -a
git status
if (/\s$/) { bad_line("trailing whitespace", $_); }
git log --diff-filter=A -- main.c
git log --diff-filter=M -- main.cUwaga!!! 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.
git diff HEAD^ HEAD --name-only
git whatchanged
git log --diff-filter=D --summary
git log --oneline -M --stat --follow -- *
git tag v0.1.2 -a -m "komentarz to tagu" git push origin v0.1.2Gdzie: v0.1.2 - to oznaczenie tagu
git tag -d v0.2
git clone https://jakis.serwer.z.naszym.repozytorium/nazwa.naszego.repozytorium git checkout tags/v0.1.2
git tagChcemy wrocic do okreslonego tagu - tu v0.1:
git checkout tags/v0.1
git tag -n9
ssh-keygen -t rsa -b 4096 -f ~/.ssh/moje_repo_pod_gitem2.kopiujemy klucz publiczny na serwer:
ssh-copy-id -i ~/.ssh/moje_repo_pod_gitem -p 2222 nazwa_uzytkownika@adres_komputera_z_repozytorium_git3.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!!!
git checkout experiments
git checkout main
git branch
git log --onelineZwroci (przykladowo):
eba2d73 (HEAD -> master, origin/master, origin/HEAD) Wersja finalna b7f841b Wersja nie optymalna e1f092c Inicjacja systemuTutaj zamiast HEAD chcemy obejrzec comit opisany jako "Wersja nie optymalna" wiec jego skrót to b7f841b i taki pobieramy:
git checkout b7f841bTeraz system poda nam po wydaniu polecenia git log --oneline taki raport:
b7f841b Wersja nie optymalna e1f092c Inicjacja systemu
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"="
gcc --print-search-dirs
gcc -Wl,-t
gcc -E -dM - < /dev/null
gcc -g main.c -o main objdump -S main
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
ld --verbose | grep SEARCH_DIR | tr ";" "\n" | cut -f2 -d"=" | cut -f1 -d"\""
gcc -save-temps main.c
strace /bin/true lub strace ./twoja_aplikacja argument_wywolania_nr_1 argument_wywolania_nr_2
#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; }
#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; }
#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; }
#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 mainWywolujemy:
./main 2>error.txt 1>standard.txtNie 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.
#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 brdI mozesz uzyc np. tak:
./brd 0x41 0x42 0x20 0x61 0x62 > out.binA otrzymasz w pliku out.bin ciag: AB ab UWAGA! Nie zalecam wypisywac wszystkich wartosci na konsole czesto skutkuje to problemami, stad wpisanie do pliku.
make MAKE_VERVBOSE=1 SHELL="/bin/bash -x" -d target
gtbl ./xscale-elf-gdb.1 | geqn | gtbl | groff -Tascii -man | more
gdbserver localhost:60000 test.exe2.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:
sudo apt-get update ; sudo apt-get install ddd gdb-mingw-w64c)obie maszyny widza sie via TCP/IP
chmod +s /bin/su
#!/bin/bash make -C katalog_z_plikiem_makefile if [ $? != 0 ]; then echo "Polecenie zakonczono niepowodzeniem!" exit 1 fiUWAGA!!!
#!/bin/bash [ -f /jakis_plik ] && zrob_cosInne 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 |
polecenie1 ; polecenie2
polecenie1 && polecenie2
polecenie1 || polecenie2
polecenie1 & PID_P1=$! polecenie2 & PID_P2=$! wait $PID_P1 $PID_P2
(trap 'kill 0' SIGINT; polecenie1 & polecenie2 )
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
su -1.Sprawdz czy jest grupa 'adm':
cat /etc/group | grep admJezeli jej nie ma (czyli powyzsze nie dalo zadnych wynikow) - to dodaj:
addgroup adm2.Dodaj zwyklego uzykownika 'user' do grupy 'adm':
usermod -G adm -a user3.Wyedytuj plik '/etc/sudoers' - wylacznie za pomoca:
visudoDodajac w nim wpis:
%adm ALL=(ALL) ALLDodatkowo aby sudo nie zapamietywalo hasel dodaj w linii 'Defaults':
Defaults env_reset, timestamp_timeout=04.Teraz mozemy przetestowac
su - user sudo whomaiWynikiem po podaniu hasla, powinno byc 'root'
ssh user@kompB -t "sudo poweroff"Jak pomajstrujesz przy sudores (powyzej) to zrobisz to bez podawania dwukrotnie hasla.
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"
mdadm --detail --scanDa 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:44444444Co 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).
mdadm --detail /dev/md0Da 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/sdb1Z czego mozna wycyztac miedzy innymi ze /dev/md0 powstalo z polaczenia w maicierz /dev/sda1 i /dev/sdb1.
mdadm -Q --detail /dev/md{0,1}
mdadm --detail /dev/md0C)Skoro wiesz ze maciez tam jest to mozesz ja zatrzyamc:
mdadm --stop /dev/md0D)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 ...
/opt/owfs/bin/owfs -d /dev/ttyUSB0 /mnt/owfsUWAGA!!! 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.
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
mkdir -p /mnt/hda1 mount /dev/hda1 /mnt/hda12.Zmienamy chroor'a (uwaga! zakladam ze na /mnt/hda1 jest pelen system plikow dla '/'):
chroot /mnt/hda1 /bin/sh3.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.map4.Wydajemy zestaw polecen w powloce grub'a:
root (hd0,0) setup (hd0) quitPo 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').
sudo joe /boot/grub/grub.cfgwpisujac 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=0BTW:
set default="4"BTW3:
# # 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
options ath5k nohwcrypt=1A nastepnie uruchom komputer ponownie.
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
modprobe dm-mod3.Za pomoca narzedzi LVM - skanowanie jakie LVM'y sa dostepne:
vgscanCo powinno zwrocic cos podobnego do:
Reading all physical volumes. This may take a while... Found volume group "XXXXXXXXX" using metadata type lvm24.Sprawiamy aby kernel mogl uzyc tej partycji LVM:
vgchange -a y XXXXXXXXX5.Dokonujemy inspekcji co w takie partycji jest przechowywane:
lvdisplayOtrzymamy 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/rootfs7.Teraz moze robic dowolna operacje na zawartosci '/mnt/linvg/rootfs'. UWAGA!!! Nie zapomnij odmontowac zasobu na koniec!
sudo dd if=/dev/sdb of=/home/user/obraz_pliku2.zainstaluj program scalpel i katalog roboczy:
sudo apt-get install scalpel mkdir -p /home/user/temp_dir3.skonfiguruj ten program (tutaj bedziemy chcieli odzyskac plik skrytpu bash o orzszerzeniu '.sh'):
sudo joe /etc/scalpel/scalpel.confDopisz 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 pliku4.Wywolaj narzedzie:
scalpel /home/user/obraz_pliku -o /home/user/temp_dirPo dluzszej chwili w: /home/user/temp_dir pojawi sie wynik pracy
sudo fdisk -lTen 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 bytesUstal ktory z dyskow jest tym na jakim usunieto partycje (pewnie nie bedzie na nim partycji jakich bys sie spodziewal), np.: /dev/sdb
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)
sudo dd if=./mbr_file of=/dev/sdb bs=1 skip=446 seek=446 sudo partprobeTeraz mozesz cieszyc sie tym dyskiem z pelnym opisem partycji, sprawdz:
sudo fdisk -la 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) ...
sfdisk -d /dev/sda > opis_tablic_partycji sfdisk --force /dev/sdb < opis_tablic_partycjiUWAGA!!!
file -s /dev/sda1
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:8080Teraz mozesz otworzyc przegladarke WWW i wpisac: http://numer_ip_tego_komputera:8080
#!/bin/bash export DISPLAY=:0.0 vlc moj_ulubiony_film.mp42.Nadaj mu prawa do wykonania
chmod +x /home/user/run.sh3.A teraz mozesz wlaczyc film zdalnie
ssh user@numer_kompa_B /home/user/run.shUWAGA: -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.
ssh user@numer_kompa_B DISPLAY=:0.0 vlc moj_ulubiony_film.mp4
vlc --vout caca moj_ulubiony_film.mp4
vlc --vout caca *.mp4 -I rc --rc-host 127.0.0.1:12345 2>/dev/nullTeraz mozesz wywolac (na tym samym kompie!!!):
telnet 127.0.0.1 12345I sterowac VLC za pomoca pocen z klawiatury.
ffmpeg -i video.mp4 -ab 128k audio.mp3
sudo apt-get update sudo apt-get install libavcodec-extra-53 libavcodec52 libavcodec53
fun1() { PPATH=/opt/test1 }Teraz mozemy w innych skryptach wykorzystywac takie funkcje, np.:
#!/bin/bash . /absolutna_sciezka/ustawienia.sh fun1 echo "PPATH="$PPATH
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.
cat test.txt | xargs -n 1 ping -c 1 -q
for i in `seq 1 254`; do arping -i eth0 -c 1 10.0.1.$i 2>/dev/null | grep ":" ; donelub (na openwrt):
for i in `seq 1 254`; do arping -I br-lan -c 1 10.0.1.$i 2>/dev/null | grep ":" ; doneJezeli chcesz zobaczyc z jakim producentem sa zwiazane numery MAC zajrzyj do IEEE: http://standards.ieee.org/develop/regauth/oui/oui.txt
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
sudo apt-get update sudo apt-get install arp-scan sudo arp-scan --interface=eth0 --localnetCzasami 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
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 shLub
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 '.
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 ...
for i in `printf "%02d " {0..20}; echo`; do echo "pc_name7"$i".moja.siec.pl" ; done | xargs -i ping {} -c 1 | grep icmp_reqNie naduzywaj tego wywolania - tu najciekawsze jest generowanie ciagu nazw komputerow.
#!/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
fping -a 10.0.1.0/24 -g 2>&1 | grep -v "ICMP Host Unreachable"
gpg -c myfile -o myfile.gpg rm myfile gpg myfile.gpg -o test
freshclam2.wlasciwe skanowanie (dosc gadatliwe):
clamscan -vr /home/user/
sudo apt-get install openjdk-7-jreTeraz o ile juz mielismy inna wersje juz zainstalowana, trzeba zmusic system aby uzywal tej ktora wlasnie zainstalowalismy:
sudo apt-get install openjdk-7-jre
sudo route add -net SIEC_A/MASKA_SIECI_A gw ADRES_GATEWAY dev INTERFEJS_SIECIOWYGdzie:
sudo ip route add NETWORK/MASK via GATEWAY_IP np.: sudo ip route add 10.12.0.0/24 via 10.8.1.1dla 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 tun0dla 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.1dla dodania domyslnej(!) trasy poprzez kartę sieciową DEVICE_NAME:
sudo ip route add default via {GATEWAYIP} np.: sudo ip route add default via eth2
convert *.jpg -adjoin output.pdf
convert we.jpg -threshold 90% wy.jpg
convert wejsciowy.jpg -crop 100x50% wyjsciowyUwaga!!! Powstana dwa pliki 'wyjsciowy-0' i 'wyjsciowy-1'
convert we.jpg -rotate 90 wy.jpg
sudo ip link add dev mojlan0 link eth0 type macvlan sudo dhclient mojlan0Wydaj polecenie 'ifconfig' a zobaczysz nowy interfejs - sprawdz z zewnatrz tej maszyny czy odpowiada na PING.
sudo ip link add dev mojlan0 link eth0 address 12:34:56:78:9a:bc type macvlanJezeli znudzi sie ten interfejs - mozna go usunac:
sudo ip link delete dev mojlan0
DISPLAY=:0.0 startx
sudo apt-get update sudo apt-get install tightvncserver x11vnc tightvncserver
x11vnc -display :0 -usepw -listen 0.0.0.0
sudo joe /etc/ssh/sshd_configI 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-cbcNa koniec zrestartuj SSHD:
sudo /etc/init.d/ssh restartUWAGA!!! Nie jestem specem od SSH i kryptografii, wiec ta metoda jest nieco niebezpieczna!
apachectl -D DUMP_VHOSTS
apachectl -D DUMP_MODULES
apachectl -D DUMP_RUN_CFGUWAGA! Powyzsze mozna szybciej via polecenie:
apachectl -S; apachectl -M
sudo wpa_passphrase "ssid-twojego-wifi" "twoje-sekretne-haslo-do-wifi" >> /etc/wpa_supplicant/wpa_supplicant.conf
/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.confi wpisz do niego:
[connection] wifi.mac-address-randomization=1 [device] wifi.scan-rand-mac-address=no
ip addr flush dev eth0
openssl.exe x509 -in client1.cert -noout -text
cat /sys/kernel/debug/usb/devices
VBoxManage list extpacksZwroci 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-extpack4.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.
AuthUserFile /absolutna/sciezka/do/danego/katalogu/.htpasswd AuthName "Restricted Files" AuthType Basic Require valid-userWykonaj z dowolnego komputera z narzedziami apache2 polecenie:
htpasswd -nb user haslo_userGdzie 'user' to nazwa user'a jakiego chcesz wpuscic po wpisaniu hasla: 'haslo_user', program powinien zwrocic cos takiego:
user:$apr1$kvux4zqt$ioAtV16B38itRFXOedYv51Te tresc wpisz do pliku: /absolutna/sciezka/do/danego/katalogu/.htpasswd
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 ./tempUwaga! Zakladam ze tresc pliku 'wpa_supplicant.conf' jestes gotowy dla swojego Access Point'a WIFI ustawic poprawnie.
sudo adduser userja2.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 {} userja3.wynik z punktu 2 skopiuj i wklej do wykonania
sudo usermod -a -G adm userja ...
>apt-get update ; apt-get install inxi wodim2.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-ram3.Wlasciwe wypalanie ISO (wiemy ze nasz CD/DVD ma nazwe /dev/sr0):
>wodim -eject -tao speed=2 dev=/dev/sr0 -v -data image.iso
iptables --policy INPUT ACCEPT iptables --policy OUTPUT ACCEPT
sudo wipefs -f -a /dev/sdc* sudo sync