Pár stébel pro tonoucí 1
V následujícím uvedu pár postupů, které mohou vyjasnit nepřehlednou situaci. Bráním se je nazývat "triky", protože toto slovo budí dojem něčeho skrytého, nestandardního, zatímco všechny uváděné postupy využívají v unixech (a tedy i v Linuxu) naprosto standardní modulárnosti, která Vám umožní řešit problém kombinováním řady drobných nástrojů.
Poznámka: v dalším textu # zastupuje prompt.
1) Někdo radí příkazovou řádku pro její efektivnost, někdo raději grafické uživatelské rozhraní (GUI). Všechny konfiguráky v Linuxu jsou textové soubory, editovatelné běžnými editory. Nachomýtne se, že potřebujete vědět, které textové soubory se změnily konfigurací, kterou jste právě provedli v GUI programu. Prostě se nechcete jen spolehnout na GUI program a chcete umět udělat totéž třeba přes telnet po síti, nebo lokálně v konzoli bez X-ek. Jak na to? Před vlastní konfigurací si založte časovou značku v libovolném adresáři, pro pořádek třeba v /temp:
#touch /timestamp - ale pojmenovat ho můžete libovolně.
Pak se spustí přísluný GUI program a v něm si nastavíte, co chcete, a pak napíšete příkaz :
#find počátečníadresář -newer /tmp/timestamp -print
Jediný problém je s volbou počátečníadresář. Může to být /, ale pak budete hledat i v /proc a to je zdlouhavé. Je proto dobré mít počáteční ponětí, kde jsou asi Vaše konfigurační soubory, nejčastěji to bude pod /etc, pokud šlo o systémové a síťové věci:
#find /etc -newer /tmp/timestamp -type f -print
V případě, že jste nastavovali volbu v konkrétním prostředí, jako je třeba GNOME nebo KDE, volba se uložila pravděpodobně do konfiguračního souboru pod vaším HOME adresářem, takže uživatel Blanka Bečičková (blbec) vytvoří příkaz:
#find /home/blbec -newer /tmp/timestamp -type f -print
Volba -type f způsobí, že se nebudou vypisovat změněné adresáře a má význam hlavně tam, kde budeme změněné soubory nejen vypisovat, ale i prohlížet. Místo závěrečného -print totiž můžete užít jinou volbu, která s vyhledanými soubory vykoná víc, než je jen vypíše:
#find /home/blbec -newer /tmp/timestamp -type f -exec kedit {}\;
Místo kedit si dosaďte libovolný editor nebo prohlížeč.
2) Mnozí novopečení uživatelé Linuxu si stěžují na to, že je zahlcuje množství souborů a adresářů a oni nevědí, kam co patří. Právě o nich potřebují vědět více v případě, že mají podezření, že vlivem experimentování, přepisování, chybného přesměrování si něco přemazali nebo přepsali, nebo zkombinovali věci, které k sobě nepatří. Právě v podobných situacích Linux prokáže svoji vysokou blbuvzdornost.
Strom není jedinou strukturou, která angažuje soubory a adresáře. Ty jsou totiž začleněny také do balíků, nebo jinak řečeno, každý balík instaluje do stromu adresáře a soubory na definované místo, a to velmi přehledně. Ano, řeč bude o RPM (RedHat Package Manager) balíčcích, jak se používají v distribucích RedHat, Suse a Mandrake, Debian má deb balíky.
Jinými slovy, existuje nijak neskrývané a snadno dostupné přiřazení mezi souborem a systémovým nebo aplikačním balíkem, který jste nainstalovali. Vyjděme třeba z ikony, v ní je název spustitelného souboru. Kde ale leží? Příkaz which vypíše celou cestu ke spustitelnému souboru, který leží v cestě obsazené v proměnné PATH. Jako příklad uvedu designer, co je builder pro snadné vytváření přenositelných GUI aplikací, zvykl jsem si ho pouštět zavoláním jména, a teď se ptám, kde leží:
#which designer - systém odpoví/usr/bin/designer
A my se ptáme na jméno balíku, který tento soubor vlastní:
#rpm -qf /usr/bin/designerqt-designer-2.3.0-3
Vypsaný balík lze při podezření verifikovat, tedy zjistit, jestli je úplný co do počtu souborů, které soubory jsou změněné apod.:
rpm -V qt-designerVšimněte si, že stačí psát zkrácené jméno bez specifikací čísel verzí a podverzí. Kdy výpis předchozího příkazu není prázdný, něco se stalo se soubory balíku, ale ne vždy je to tragedie. Například konfigurační soubory budou z principu označeny jako změněné. Význam symbolů změny v balíku je vzat z manuálových stránek příkazu rpm:
man rpm ......The following characters denote failure of certain tests:5 - je změna kontrolního součtu, tedy obsahu souboru, u konfiguráků přirozený jev. S ní se druží změna délky
5 MD5 sum S File size L Symlink T Mtime D Device U User G Group M Mode (includes permissions and file type)
S, L - indikuje že se jedná o odkaz (link) na soubor
D - o speciální zařízení
U a G - souvisí se změnou uživatele a skupiny
M - s právy a typem souboru.
Evidentně poškozený balík lze reinstalovat:
#rpm -U --replacepkgs balik*-*-*-*-rpm
Volba -U zachová stávající konfiguráky a opatří je příponou pmsaved, volba --replacepkgs umožní náhradu stejného stejným. Tentokrát se musí psát úplné jméno balíku až po závěrečné rpm.
3) Knihovny - jak zjistit, které nějaký program využívá? Ptám se na to zase u programu designer:
#ldd /usr/bin/designer
Příkaz ldd je všechny vypíše, pro stručnost jen začátek
libqutil.so.1 => /usr/lib/qt-2.3.0/lib/libqutil.so.1 (0x40028000) libqt.so.2 => /usr/lib/qt-2.3.0/lib/libqt.so.2 (0x4002f000) libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x40504000)
Tady nastal čas ukázat, jak lze výpis zformátovat za chodu využitím unixovské modularity. Nejdřív chceme z výpisu separovat druhou část s cestami ke knihovnám, a pak na tyto soubory uplatnit příkaz :
ls -l, abychom o nich věděli víc:
#ldd /usr/bin/designer |cut -d">" -f2
Použili jsme příkaz cut a sdělili mu, že v proudu dat má najít delimiter (oddělovač) > a propustit field (pole) č. 2 na výstup. Dále z proudu odsekneme od vlastních cest a souborů ty specifikace offsetů (asi to budou ony) následující po mezeře :
#ldd /usr/bin/designer |cut -d">" -f2 | cut -d" " -f2
Výpis vypadá nějak takhle:/usr/lib/qt-2.3.0/lib/libqutil.so.1 /usr/lib/qt-2.3.0/lib/libqt.so.2 /usr/lib/libstdc++-libc6.2-2.so.3
Výstup příkazu lze včlenit do jiného:
#prikaz1 `prikaz2` nebo nověji # prikaz1$(prikaz2)
ls -l `ldd /usr/bin/designer |cut -d">" -f2 | cut -d" " -f2`
nebo třeba do příkazu stat (vypíše všechny existující informace o souboru):
stat `ldd /usr/bin/designer |cut -d">" -f2 | cut -d" " -f2`
Novějším způsobem:
ls -l $(ldd /usr/bin/designer |cut -d">" -f2 | cut -d" " -f2)stat $(ldd /usr/bin/designer |cut -d">" -f2 | cut -d" " -f2)
Už chápete, proč si tolik správců oblibuje příkazovou řádku? Místo aby se uklikali k smrti, mnoho z nich řeší na první pohled složité úlohy tak, že si v ní odladí velmi efektivní příkazy, zapíše je do dávkového souboru a je vymalováno.
Konkrétně lze takhle napsat třeba kontrolní systém zkoumající integitu celé instalace, nebo zálohovací utility - rád s nimi pomohu.
Ale co s cykly ? Shelly větve sh i csh umí sekundární prompt, který umožní zadat jako příkaz i cyklus. Následující příklad je pro shelly typu sh, čili třeba bash:
Napište k promptu #for Q in `ls` systém vypíše sekundární prompt>
a to je výzva, abyste pokračovali cyklem
> do
> stat $Q
> done
a rozběhne se výpis vlastností všech souborů, jejich jména jsou v cyklu dosazována do proměnné Q.
Myslím, že když se i v příkazové řádce dá dynamicky měnit proměnná, otevírá se tím cesta k zajímavým a hlavně využitelným experimentům. Hodně zdaru.
Autor : Jiří Kouba




















