Typicky bulvární titulek, ale v tomto případě jsem si ho nemohl
odpustit, jelikož cituji přímo blog
vývojáře. Kdo neví, Paludis je alternativní balíčkovací
systém s podporou více formátů, momentálně ebuildů pro
distribuce Gentoo a Exherbo. Vývoj se žene kupředu rychlostí blesku a již
před rokem jím bylo bez větších problémů možné z velké části
nahradit současný Portage. Vývojáři však nyní uvedli nový
klientský program cave, který by měl jednou provždy umlčet
věčné flamewary ohledně příkazové nekompatibility mezi těmito
systémy.
Paludis, paludis a paludis
Paludis již od počátku disponoval klientským programem
paludis, na kterém jsme všichni společně vyrostli a vžili si
do paměti příkazy typu:
paludis -pi world
paludis --dl-blocks discard -i world
A nebo mé oblíbené:
paludis -pu --with-unused-dependencies --permit-unsafe-uninstalls cat/some-pkg
… a oni nám to chtějí zrušit!
Představuje se cave
Dle mého názoru naprosto nevhodně zvolené jméno programu, ale jinak
cave vypadá mnohem robustněji a elegantněji. Elegance na nás
srší již od prvního pohledu, kupříkladu příkaz install
neexistuje, jmenuje se resolve. A když se chceme podívat do
nápovědy, cave resolve --help vypíše neuvěřitelných
151 řádků! V tom aby se prase vyznalo, je tedy lepší
používat man. Manuálovým stránkách dávám bod za
rozčlenění, další krátkému příkazu help za jednoduchý a
stručný výpis nejčastějších funkcí. Mile mě potěšil
fix-linkage, díky kterému je vyřazen další klient, a to
reconcilio. Pamatuji si, jak jsem prvních několik měsíců
používání Paludise měl neskutečný problém vzpomenout si na ten
připitomělý název, abych opravil špatné linkování knihoven. Příkaz
purge zjednodušuje původní paludis -u
--uninstall-unused, hlavně je hned v základní nápovědě, a tak ho
člověk nemusí hledat kdesi v manuálu. Za zmínku už snad stojí jen
sync, uninstall a search, jehož
hledání je snad ještě zdlouhavější než dřív – a u toho se
zastavím, odjakživa je nepoužitelné.
Obecná vsuvka o vyhledávání
Vyhledat jeden balíček mi trvá přibližně 5 minut, takže kešovaná
SQLite databáze v programu eix je k nezaplacení. Stále se
ptám, proč při operacích hledání Paludis kontroluje strukturu
všech ebuildů a ještě k tomu drze vypisuje, abych
přepsal řádek se SLOT="0" na SLOT=""? K čemu mi
to je, běžnému uživateli? To si snad tohoto problému vývojáři nevšimli
a nebo je to jen hluboký defekt ext3
filesystému v kombinaci s mým strojem, diskem či tak?
Závěrem
Před pár dny vyšla nová verze Paludise, která oficiálně publikovala
i výše zmíněný cave. Zhruba hodinu jsem studoval dokumentaci
a možnosti tohoto klienta a nakonec upravil svůj synchronizační skript tak,
aby ho používal. Na závěr uvádím ukázky nové příkazové syntaxe
včetně starších ekvivalentů:
cave sync || paludis -s --multitask
cave resolve -c world || paludis -pi world
cave resolve -cx world || paludis -i world
cave fix-linkage || reconcilio
Nutno podotknout, že při updatu world oba klienti řeší
závislosti trochu odlišně. To ostatně možná zjistíte sami hned při
prvním použití :)
Odkazy
Štítky:
Tipy a triky
GNU Screen je textový skoro window manager umožňující uchování
otevřených terminálů uvnitř jediného okna s možností použití jako
vzdálené session. Jednoduše řečeno, vezmu-li SSH spojení, screen udrží
spuštěné např. irssi, centerim, SSH na další
stroj a mnohem více.
Bohužel ve výchozí konfiguraci je poněkud nešťastný, protože ihned
nevidíte např. otevřená okna nebo ve kterém okně momentálně jste. Navíc
jsou některé klávesové zkratky nepřirozené, a proto jsem kdysi začal
zkoumat manuál a možnosti konfigurace. Naneštěstí jsem dlouho nebyl
úspěšný. Nakonec mi však kamarád Jedjisch poslal svůj konfigurační
soubor, který téměř vyřešil veškeré mé problémy.
Celý konfigurační soubor se do článku nevejde, proto prosím použijte
odkaz pro stažení na konci článku. Za zmínku stojí přemapované klávesy
pro aktivaci okna 0 a 10, ke kterým se na české klávesnici přistupovalo
špatně, upravený řádek hardstatus, který na spodním řádku
screenu ukazuje barevně výpis oken (barevné kódy dalo práci zjistit,
nakonec vyhrála metoda pokus-omyl), nastavení monitorování aktivity a
výchozího okna v posledních řádcích souboru.
Konfigurační soubor je k dispozici zde.
Přejmenujte na .screenrc a umístěte do domovského adresáře.
Pro načtení do již běžícího screenu použijte příkaz:
^a :source ~/.screenrc
kde ^ značí klávesu Control.
Štítky:
Tipy a triky
K tomuto nápadu mě kdysi přivedl kamarád Chytrex během jednoho z mnoha
povídání o své náplni práce. Ve stručnosti, přijde tiket
(v konkrétním příkladu mi byl ukázán řádek ze systémového logu), a
jeho úkolem je problém vyřešit. A to mi vnuklo nápad nechat si zasílat
problémy ze syslogu na e-mail.
Chvíli jsem googlil a nakonec našel jednoduchý perl skript (zdroj již
bohužel neznámý), který se nechá pouštět od syslog-ng a hloupě
přeposílá zprávu přes sendmail. Několik let mi to takto
stačilo, ale pak mě začaly obtěžovat zprávy s nesmyslně vysokou
facility (prioritou) bez jakékoli informační hodnoty.
Rekompilovávat upravené zdrojové kódy několika balíčků mě po chvilce
přestalo bavit, a tak jsem skript obohatil o pár řádků s podporou
klíčových slov k vyloučení (viz pole @exclude).
#!/usr/bin/perl -n
# thanks to Brian Dowling for an example with security in mind.
$TO = 'admin@dragonjake.net';
$FROM = 'system@dragon.dragonjake.net';
@exclude = ("_nss_mysql_getspnam_r conf file parsing failed", # nss-mysql
"Statement may not be safe to log in statement format", # mysql-server
"Error getting poly dir context, No data available", # pam
"sshd.+(already in use|cannot listen to port)", # sshd
"pam_namespace.+Unmount" # pam
);
foreach $item (@exclude) {
if ($_ =~ m/$item/i == 1) {
exit;
}
}
s/^<\d{1,2}>//;
open(MAIL, "|/usr/sbin/sendmail -t -i");
print MAIL << "EOT";
To: $TO
From: $FROM
Subject: Log Alert: $_
$_
EOT
close(MAIL);
Skript by sám o sobě nefungoval, a tak je potřeba syslog-ng
sdělit, že ho chceme používat. Vlastní filtry f_grsec a
f_nmail používám pro omezení zbytečného spamu generovaného
grsec patchem a mailserverem. Představte si totiž případ, kdy se
mailserver rozbije a syslog-ng začne jeho chybové hlášky ukládat
jako e-maily k odeslání. Výsledkem je téměř nekonečná smyčka chyb a
fronta přesahující velikost několika tisíců e-mailů. Konfigurace
v útržcích vypadá následovně:
...
# e-mail alert
destination da_admin { program("/home/bin/syslog-alert.pl"); };
...
# ignore grsec spam
filter f_grsec { not match("grsec"); };
filter f_nmail { not facility(mail); };
...
# e-mail alert with at least err priority
log {
source(s_all);
filter(f_grsec);
filter(f_nmail);
filter(f_at_least_err);
destination(da_admin);
};
Filtr f_at_least_err je v mé distribuci (Debian, Ubuntu)
nativně, pro jistotu uvedu jeho definice:
filter f_at_least_err { level(err..emerg); };
Štítky:
Tipy a triky
Stává se vám, že se při práci emulátor terminálu zasekne? Nereaguje,
bušení do klávesnice nepomáhá a jediná možnost je tvrdý
kill? Možná jste omylem narazili na kouzelnou klávesovou zkratku
Ctrl+S…
Proč?
Zkratka Ctrl+S (dále jen ^S) a její opačný
ekvivalent Ctrl+Q (dále jen ^Q) řídí funkce
takzvaného flow control, v překladu řízení toku.
V dobách minulých a již dávno zapomenutých totiž neexistovaly emulátory
terminálů. Hádáte správně, byly pouze terminály. Takový terminál je
obecně vzato kus hardware s monitorem, klávesnicí a komunikačním portem
(foto).
Terminál se pak připojí k cílovému počítači a práce může začít.
Avšak aby komunikace mohla probíhat správně, je potřeba definovat protokol.
A zde přichází kámen úrazu. Řízení toku musí být implementováno
oběma komunikujícími stranami, což je splněno i v dnešní době na nám
moc dobře známých softwarových emulátorech.
Jak se toho zbavit?
Obecně vzato, příkaz ^S potlačuje výstup a příkaz
^Q toto potlačení ruší. Někteří by mohli namítat, ale je
důležité si uvědomit, že výstup v chápání terminálu znamená
i vytištění napsaného textu. Proto se ^S chová, jako by
způsobil úplné zamrznutí.
Naštěstí je řešení jednodušší, než by se mohlo zdát. Černou magii
odstraní příkaz:
stty -ixon -ixoff
Tento řádek doporučuji umístit do .bashrc či do jiného
souboru vykonávaného při inicializaci vašeho oblíbeného shellu.
Odkazy
Štítky:
Tipy a triky
Trocha teorie
Dlouholetým problémem UNIXově
založených operačních systémů je adresář /tmp sloužící
jako dočasné úložiště pro všechny. Tento adresář má práva nastavená
na rwxrwxrwx, tedy zápis pro kohokoli. Nevýhodou však byl
i absolutní přístup k datům jiných uživatelů, a proto byl zaveden tzv.
sticky bit, který omezuje zápis pouze na soubory a adresáře
vlastněné patřičným uživatelem. Každý tedy může zapisovat nové
soubory, ale jen do těch existujících, které vlastní.
Novou možnost fyzické separace pak nabízí tzv.
polyinstantiation. Každému uživateli namapuje daný adresář na
jiný, pro něj v původní cestě nepřístupný. V případě adresáře
/tmp by se např. jednalo o mapu z /tmp-inst nebo
klidně i /tmp/users. Mechanismus, který polyinstancování
zajišťuje, automaticky vytvoří adresář dle uživatelského jména a jím
nahradí cílový adresář dle mapy.
Ukázka z praxe
Nastavení se provádí v konfiguračním souboru
/etc/security/namespace.conf prostřednictvím PAM modulu
pam_namespace.so:
# /etc/security/namespace.conf
#
# See /usr/share/doc/pam-*/txts/README.pam_namespace for more information.
#
#/tmp /tmp-inst/ both root,adm
#/var/tmp /var/tmp/tmp-inst/ both root,adm
#$HOME $HOME/$USER.inst/inst- context
/tmp /tmp/users/ user root
Zakomentované příklady zahrnují polyinstancing /tmp,
/var/tmp (který osobně doporučuji nastavit jako symbolický
odkaz do /tmp) a domovského adresáře uživatele. Důležitý
parametr je typ, který zpravidla může být:
- user (na základě uživatelského jména)
- context (na základě bezpečnostního kontextu, pouze
SElinux)
- both (obojí)
Poslední čtvrtý parametr udává výjimky. V mém případě bude na
základě uživatelského jména namapován adresář /tmp z
/tmp/users s výjimkou uživatele root.
Jak na to
Nejprve vytvoříme adresář, ze kterého budeme mapovat, v mém případě
/tmp/users. Tomuto adresáři nastavíme z bezpečnostních
důvodů nulová práva a zadáme mapu
v konfiguračním souboru /etc/security/namespace.conf.
Nyní je třeba pečlivě zvážit nastavení modulů PAM. Po zkušenostech
z praxe nedoporučuji spouštět PAM modul ve
všech případech autentizace (soubor
/etc/pam.d/common-session, způsobí to více problémů než
užitku. Polyinstancování jsem proto zúžil na dva jediné typy
autentizace – login a sshd.
Ukázka začlenění PAM modulu do souboru s autentizací:
# Enable polyinstantiation
session required pam_namespace.so
Je třeba dát si pozor na to, kam modul umístíme. Existují místa, kdy je
moc brzy a kdy zase moc pozdě – lepší je si to párkrát zkusit a pozorně
sledovat logy (např. auth.log). Pokud se mechanismus aplikuje,
měli bychom po novém přihlášení mít adresář /tmp
v ideálním případě prázdný. Přihlásíme-li se na roota, měli bychom
vidět /tmp/users a v něm adresář s naším a případně
dalšími uživatelskými jmény. Máme hotovo.
Osobně mám přímé přihlášení na root uživatele zakázané a
přistupuji přes sudo. Bohužel v tomto případě se mi nepodařilo sudo
nijak donutit vyvolat čistý login (nejspíše proto, že sudo je spouštěno
z shellu, na který již bylo polyinstacování aplikované), takže ani po
přihlášení na roota mi /tmp neodhalil žádná svá tajemství.
Pokud nedejbože nutně potřebuji vidět obsah neořezaného /tmp,
obejdu bezpečnostní mechanismus mountnutím root partition např. do
/mnt a podívám se tam :)
Štítky:
Tipy a triky