Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: nettezzaumana 11 Července 2008, 02:15:10

Název: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 11 Července 2008, 02:15:10
fujtajbl vespolek >>

vcera jsem trocha badal (s kancem aka diwoczaakem) a vysledek je toto *dite v plenkach* (viz skript nize) ..

skript vytvori a nakonfiguruje adresar s chrootem, nakopiruje tam z beziciho systemu /bin /sbin a /usr/sbin, doplni do lib knihovny, pripoji /proc do chrootu a chrootne se do nej. Ve chrootu lze potom bezpecne provozovat pokusy aka rm -frv / :D, hackovat kamarady a vubec delat ruzna zversta.

po ukonceni chrootu prikazem exit skript odmountne proc a uklidi po sobe smazanim chrootu, takze nezanechava po sobe zadne stopy ..

vyhody ::
1) idealni prostredi na vytvareni napr. vlastniho LFS
2) idealni prostredi na pokusy a ruzna zverstva
3) aplikace spustene z chrootu jsou zdaleka to nejbezpecnejsi co lze mit
4) skript je nekolikrat odzkouseny a v mem prostredi bezi bezvadne, uklizi po sobe, takze po jeho skonceni je system netknuty

omezeni ::
1) chroot neni bohuzel uplne nakonfigurovan (diky pozdni nocni dobe) jak ma, takze tam treba nechodi napr. DNS resolution (ale sit ano)
2) chroot obsahuje pozouze zakladni prostredi CLI
3) skript nutno spoustet jako root (ale potom to bezi ve chrootu, takze by nemelo hrozit zadne nebezpeci)

plans for future ::
1) skript ma byt v budoucnosti generator bootovatelneho fallback .iso image beziciho systemu .. toto je zatim takove demo..
2) 1000+1 rozsireni v v dohledu .. moznosti jsou nekonecne

ad.x) skript napsan "pracovne" a po jeho proletnuti muze byt pokrocilejsimu uzivateli naprosto zrejme, jak si do nej implementovat dalsi aplikace ze systemu, pripadne jak ho jednoduse upravit tak, aby po sobe neuklizel a jenom generoval "base" chrootu. S takovymto zakladem lze dale cvicit, tunit ho a rozsirovat ..

skript je zde ::
Kód: (mkchroot.sh) [Vybrat]
#!/bin/bash

if [ "$UID" -ne '0' ]; then
        echo "sorry. you must run this as root..";
        exit 1;
fi

if [ -z "$1" ] || [ -d "$1" ]; then
        echo "gimme chroot dir to create..";
        exit 1;
fi

CHROOT_DIR="$1";

mkdir $CHROOT_DIR;

for x in bin sbin lib etc proc usr usr/sbin; do
        mkdir $CHROOT_DIR/$x;
done

for x in bin sbin usr/sbin; do
        cp -rv /$x/* $CHROOT_DIR/$x;
done

for x in $(find "$CHROOT_DIR/bin" "$CHROOT_DIR/sbin" "$CHROOT_DIR/usr/sbin"); do
        ldd $x 2>&1;
done | sed '/\s\//!d;s/^[^\/]*//;s/\s.*$//;/:$/d' | sort | uniq >$CHROOT_DIR/libs.final

while read line; do
        cp -v $line $CHROOT_DIR/lib/;
done <$CHROOT_DIR/libs.final

echo -e '/lib\n' >$CHROOT_DIR/etc/ld.so.conf;
ldconfig -r $CHROOT_DIR;

echo -e 'proc\t/proc\tproc\tdefaults\t0 0' >$CHROOT_DIR/etc/fstab;

echo "chrootdir created as $CHROOT_DIR & looks like prepared";

# mountneme /proc a chrootneme se
chroot $CHROOT_DIR mount -a;
chroot $CHROOT_DIR /bin/bash;

# uklid a mazani $CHROOT_DIR
chroot $CHROOT_DIR umount /proc;
rm -rv $CHROOT_DIR;

exit 0;

ukazka, jak to funguje ::
Kód: [Vybrat]
# ./mkchroot.sh /tmp/chroot
... // redakcne vystrizeny debugovaci vypisy, neb jsou dlouhe
chrootdir created as /tmp/chroot & looks like prepared
bash-3.2# ping 10.0.0.138 ## ping na muj router.. sit nam bezi
PING 10.0.0.138 (10.0.0.138) 56(84) bytes of data.
64 bytes from 10.0.0.138: icmp_seq=2 ttl=254 time=1.75 ms
64 bytes from 10.0.0.138: icmp_seq=3 ttl=254 time=1.48 ms
64 bytes from 10.0.0.138: icmp_seq=4 ttl=254 time=1.92 ms
^C
--- 10.0.0.138 ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 3020ms
rtt min/avg/max/mdev = 1.481/1.720/1.928/0.190 ms
bash-3.2# ping 77.75.76.3 ## ping na seznam.cz
PING 77.75.76.3 (77.75.76.3) 56(84) bytes of data.
64 bytes from 77.75.76.3: icmp_seq=1 ttl=57 time=24.5 ms
64 bytes from 77.75.76.3: icmp_seq=2 ttl=57 time=24.1 ms
^C
--- 77.75.76.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 24.195/24.354/24.514/0.223 ms
bash-3.2#  ping seznam.cz ## dle Domeny uz to nejde
ping: unknown host seznam.cz
bash-3.2# nmap -vv 127.0.0.1 ## huh, nemame tu nmap
bash: nmap: command not found
bash-3.2# exit
.. // o5 redakcne zkraceno
removed directory: `/tmp/chroot'

predtim jsem si udelal nasledujici prikaz ::
nettezzaumana@kokina:~> du -h /tmp/chroot/ 2>&1 | tail -n 1
116M    /tmp/chroot/

// ze ktereho je patrne, ze pri teto konfiguraci ma chroot pouhych 116M .. bez /usr/sbin jsem spolehlive fungoval ve 30ti ..

doufam, ze se Vam tato vec libi a budete do ni prispivat a rozsirovat ji, neb je to pro zvidavou dusi skutecne bezvadny zaklad (treba k tomu, udelat si vlastni minimalistickej system o velikosti 20MB)

enjoy by ntz ;)
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 11 Července 2008, 02:38:11
ad.1) dopredu odpovim na nevyslovenou otazku ::
alfa/omega celeho kouzla je v tomto cyklu ::

for x in $(find "$CHROOT_DIR/bin" "$CHROOT_DIR/sbin" "$CHROOT_DIR/usr/sbin"); do
        ldd $x 2>&1;
done | sed '/\s\//!d;s/^[^\/]*//;s/\s.*$//;/:$/d' | sort | uniq >$CHROOT_DIR/libs.final

ten nam vytvori soubor $CHROOT_DIR/libs.final, ktery obsahuje seznam vsech potrebnych knihoven, ktere se linkuji k obsahu nasi chrootovane $PATH .. pokud si teda rucne vytvorite strukturu $PATH vase *custom_chrootu* a pouzijete tento cyklus, tak ten prilinkuje pouze ty knihovny, ktere jsou potreba (resp je zapise do seznamu) .. takze napriklad pokud rucne vlozite so $CHROOT_DIR/bin napriklad nmap jako binarku, tak nepujde pouzit, dokud se k ni v novem chrootu nenakonfiguruji jeji knohovny ..

Takto si lze trebas vytvorit minimalisticky system (treba i x xkama do 100MB), ktery obsahuje pouze to, co skutecne chceme .. nic vic..
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 11 Července 2008, 15:38:21
ad.x) funguje bez zasahu na BSD i Solarisu .. wow
ad.y) Jsou s nim problemy na gentoo .. njn. Tam kde to nejni EMO tak alespon strasi ..
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: Kazekage 11 Července 2008, 15:46:59
hehe ty vzdy prekvapis nejakym obludnym scriptom


done | sed '/\s\//!d;s/^[^\/]*//;s/\s.*$//;/:$/d' | sort | uniq >$CHROOT_DIR/libs.final

ale inac RESPECT  :)
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: Zelvuska 14 Července 2008, 19:15:08
Dobra prace, ale nejak mi to konci chybou... a vubec ji teda nerozumim...
Kód: [Vybrat]
chroot: cannot run command `mount': No such file or directory
chroot: cannot run command `/bin/bash': No such file or directory
chroot: cannot run command `umount': No such file or directory
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: wam]Spider007 14 Července 2008, 19:20:27
for x in $(find "$CHROOT_DIR/bin" "$CHROOT_DIR/sbin" "$CHROOT_DIR/usr/sbin"); do
        ldd $x 2>&1;
done | sed '/\s\//!d;s/^[^\/]*//;s/\s.*$//;/:$/d' | sort | uniq >$CHROOT_DIR/libs.final
na com ficis? :D
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 14 Července 2008, 19:30:19
...
na com ficis? :D
<< na openSuSE ;)
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 14 Července 2008, 19:33:39
Dobra prace, ale nejak mi to konci chybou... a vubec ji teda nerozumim...
Kód: [Vybrat]
chroot: cannot run command `mount': No such file or directory
chroot: cannot run command `/bin/bash': No such file or directory
chroot: cannot run command `umount': No such file or directory
<< hmm. zvlastni
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: Zelvuska 15 Července 2008, 00:32:30
<< hmm. zvlastni

No tak mam dalsi zjisteni, pokud to spustim "./mkchroot.sh /tmp/chroot", tak je vystup takovy jako jsem psal vyse.
Pokud spustim "sh mkchroot.sh /tmp/chroot", tak je vystup obohacen na prvnim radku o tohle:
Kód: [Vybrat]
[: 6: Illegal number:Nemely by tyhle dva zpusoby spousteni byt ekvivalentni?
Jinak co sem tak zbezne prohlizel to co to vypisuje, tak to vsechno spravne nakopiruje a take uspesne smaze...akorat k tomu namountnuti nedojde... Nejak tomu nerozumim...
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: kkaarreell 15 Července 2008, 09:33:03
Pokud spustim "sh mkchroot.sh /tmp/chroot", tak je vystup obohacen na prvnim radku o tohle:
Kód: [Vybrat]
[: 6: Illegal number:Nemely by tyhle dva zpusoby spousteni byt ekvivalentni?
Nesouvisi to s timto tematem, tak snad nedostanu od ntz vynadano. :-D Kdyztak ten svuj prispevek smaz a ja smazu i ten muj. Tyto dva zpusoby ekvivalentni nejsou. Zatimco ./mkchroot.sh spusti skript v programu, jez je uveden na prvnim radku (/bin/bash), v druhem pripade jej spoustis explicitne pomoci sh, coz je myslim v ubuntu momentalne symlink na /bin/dash. Toz odtud tedy nejspis bude onen rozdil.

Pokud jde o tu chybu, mozna by pomohlo, kdyby jsi uvedl log cely (i to, co tomu predchazi), aby bylo videt, jestli se ti vsechny programy v poradku nakopirovaly.
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 15 Července 2008, 10:15:36
Nesouvisi to s timto tematem, tak snad nedostanu od ntz vynadano. :-D Kdyztak ten svuj prispevek smaz a ja smazu i ten muj..
<< ja uz vim, ktera bije .. ty jsi zenska karliku ..!
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: Zelvuska 15 Července 2008, 10:24:01
Aha... Diky za vysvetleni.
Log je ponekud dlouhy na postnuti sem, tak jsem ho nahral na leteckou postu (http://leteckaposta.cz/736982441)...
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 15 Července 2008, 10:59:58
Aha... Diky za vysvetleni.
Log je ponekud dlouhy na postnuti sem, tak jsem ho nahral na leteckou postu (http://leteckaposta.cz/736982441)...
<< ale ja v tom logu zadne chyby nevidim .. vypada to v poradku .. zkus sem dat ten log, ale ze skriptu odmaz ten parametr '-v' (verbose) u prikazu cp .. je tam na dvou mistech .. jednou je tam .. cp -rv (zmen na cp -r) a podruhe jenom cp -v ..
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: Zelvuska 15 Července 2008, 12:19:01
Jeste jsem zrusil verbose mode u toho uklidu, pokud je to ok...
Vystup je potom takovyhle:
Kód: [Vybrat]
root@Zelvuska:/tmp# ./mkchroot.sh chroot
chrootdir created as chroot & looks like prepared
chroot: cannot run command `mount': No such file or directory
chroot: cannot run command `/bin/bash': No such file or directory
chroot: cannot run command `umount': No such file or directory
root@Zelvuska:/tmp#

Nemuze mi chybet nejaky balik? Na cem vsem to muze zaviset?
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: kkaarreell 15 Července 2008, 13:13:04
<< ja uz vim, ktera bije .. ty jsi zenska karliku ..!
Ale prosimte...

Dovolil bych si jednu navrhnout "kosmetickou upravu". Pri praci v "chudem" shellu to muze pridat na prehlednosti.
Kód: [Vybrat]
echo -e 'PS1="(chroot) $PS1"' > $CHROOT_DIR/etc/profile
chroot $CHROOT_DIR /bin/bash --init-file /etc/profile;

Zelvuska: Jsi si jisty, ze jsi ten skript dobre zkopiroval? Mozna se ti nejakej ten dlouhej radek zalomil.
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 15 Července 2008, 13:56:32
..
<< spis si zkus pane experte misto urazeni lamat hlavu s nasledujicim TODO listem ::

1) sitovani .. nejde tam zatim DNS.
2) podpora ramdisku .. chroot by byl idealni do ramdisku

.. ja se o wk chystam na nasledujici veci ::

1) fetchnuti bootu a initu (spis napsani noveho)
2) provazani s mkisofs, takze s prepinacem to vytvori bootovatelne .iso z beziciho systemu ..
3) idealni stav povazuju vytvoreni .iso, vytvoreni bootrecordu na usb disk instalace grubu (na usb disk) a diky tomu dostupny boot celeho pocitace do '/' v ramdisku ..
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: Zelvuska 15 Července 2008, 21:18:15
Zelvuska: Jsi si jisty, ze jsi ten skript dobre zkopiroval? Mozna se ti nejakej ten dlouhej radek zalomil.

Jojo kontroloval sem to nekolikrat...
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: Zelvuska 15 Července 2008, 22:52:48
Tak s pomoci kkaarreella vyreseno. Navedl me na hledani knihoven potrebnych pro mount a prisli jsme na to, ze ten skript jaksi nepocita s 64-bit systemem, takze sem si ho upravil nasledovne (vlozene kopirovani lib64) a krasne to funguje:

Kód: [Vybrat]
#!/bin/bash

if [ "$UID" -ne '0' ]; then
        echo "sorry. you must run this as root..";
        exit 1;
fi

if [ -z "$1" ] || [ -d "$1" ]; then
        echo "gimme chroot dir to create..";
        exit 1;
fi

CHROOT_DIR="$1";

mkdir $CHROOT_DIR;

for x in bin sbin lib lib64 etc proc usr usr/sbin; do
        mkdir $CHROOT_DIR/$x;
done

for x in bin sbin usr/sbin; do
        cp -r /$x/* $CHROOT_DIR/$x;
done

for x in $(find "$CHROOT_DIR/bin" "$CHROOT_DIR/sbin" "$CHROOT_DIR/usr/sbin"); do
        ldd $x 2>&1;
done | sed '/\s\//!d;s/^[^\/]*//;s/\s.*$//;/:$/d' | sort | uniq >$CHROOT_DIR/libs.final

while read line; do
        cp $line $CHROOT_DIR/lib/;
        cp $line $CHROOT_DIR/lib64/;
done <$CHROOT_DIR/libs.final

echo -e '/lib\n' >$CHROOT_DIR/etc/ld.so.conf;
ldconfig -r $CHROOT_DIR;

echo -e 'proc\t/proc\tproc\tdefaults\t0 0' >$CHROOT_DIR/etc/fstab;

echo "chrootdir created as $CHROOT_DIR & looks like prepared";

# mountneme /proc a chrootneme se
chroot $CHROOT_DIR mount -a;
chroot $CHROOT_DIR /bin/bash;

# uklid a mazani $CHROOT_DIR
chroot $CHROOT_DIR umount /proc;
rm -r $CHROOT_DIR;

exit 0;

Mam tedy navrh na upravu...slo by na zacatek skriptu hodit nejake zjisteni verze systemu? Aby mohl byt jeden skript pro 32 i 64-bit?
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: kkaarreell 15 Července 2008, 22:59:33
no, ale to dvoji kopirovani je dost osklivy workaround (plytvani mistem).. jestli neusnu, tak to zkusim vyresit nejak "systemoveji"

ikdyz, nestacilo by to "dvoji" kopirovani jen nahradit timto?
Kód: [Vybrat]
if grep -q "/lib64" $line; then cp $line $CHROOT_DIR/lib64/; else cp $line $CHROOT_DIR/lib/; fi nemam 64 bit, tak to nedovedu overit... a vubec, jdu spat.
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: Zelvuska 15 Července 2008, 23:02:33
no, ale to dvoji kopirovani je dost osklivy workaround.. jestli neusnu, tak to zkusim vyresit nejak "systemoveji"

Jak dvoji? jsou to preci dva adresare s knihovnama... Ale pokud prijdes na elegantnejsi reseni, tak klidne  ;)
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 15 Července 2008, 23:05:16
Navedl me na hledani knihoven potrebnych pro mount a prisli jsme na to, ze ten skript jaksi nepocita s 64-bit systemem, takze sem si ho upravil nasledovne (vlozene kopirovani lib64) a krasne to funguje:
<< to je pravda .. ja jsem 64bitovej system nikdy ani nezkousel ..
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: kkaarreell 15 Července 2008, 23:17:24
Jak dvoji? jsou to preci dva adresare s knihovnama... Ale pokud prijdes na elegantnejsi reseni, tak klidne  ;)
no, je to dvoji, jelikoz kazdou tu knihovnu ve skriptu zkopirujes jak do lib, tak do lib64... ten predchozi prispevek jsem updatoval. knihovny se roztridi podle toho, jestli je z lib64 nebo ne... ikdyz nevim, jestli to bude stacit, s 64bit platformou nemam zkusenost.
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: nettezzaumana 15 Července 2008, 23:19:32
Jak dvoji? jsou to preci dva adresare s knihovnama... Ale pokud prijdes na elegantnejsi reseni, tak klidne  ;)
no, je to dvoji, jelikoz kazdou tu knihovnu zkopirujes jak do lib, tak do lib64... ten predchozi prispevek jsem updatoval. knihovny se roztridi podle toho, jestli je z lib64 nebo ne... ikdyz nevim, jestli to bude stacit, s 64bit platformou nemam zkusenost.
ad.1) takze knihovny se zdvojuji?? nesel by teda udelat spis nejaky generator, kterej by vy{sym}linkoval strukturu /lib64 z /lib ??
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: kkaarreell 15 Července 2008, 23:28:54
mozna by i stacilo nechat vsechno v lib, jak to bylo, a jen vytvorit symlink lib64 na lib.. pokud teda v knihovnach neni nejaky konflikt nazvu, to netusim.. asi by to chtelo ty moznosti vyzkouset.. a pak si mezi funkcnimi hodit minci. :-)
Název: Re: chroot skript << pouze pro zvidave
Přispěvatel: Zelvuska 16 Července 2008, 00:01:17
Hadam tedy, ze ani jeden nemate 64-bit? Tak postujte skripty, budu zkouset ;)

Edit: tak jak sem si to ted prohlizel by mozna stacily symlinky...

Edit2: Tak se smylinkama to funguje, akorat se mi to nedari dat do nejakeho rozumneho cyklu...