/home mappa helyreállítása

Fórumok

A chown olyan paraméterezését kérném, ami rekurzívan minden felhasználónak a tulajdonába adja a saját /home alatt lévő mappát. (sok felhasználó van az egyesével történő állítgatásra)

merthogy valami félrement, és /home/andrástól /home/zsolt-ig pisti a tulaja. A csaoport jó, csak a tulaj mászott el.

köszönöm!

Hozzászólások

for i in `ls /home`; do getent passwd $i |awk -F: '{print "chown -R "$1"."$1" "$6}'; done

Ha rögtön akarod a chown-t, akkor fogod és s print helyett használod a system-et.

ekkor feltételezed, hogy az egyes felhasználók nevei és home könyvtárai ugyanolyan elnevezésűek.
számos helyen előfordul, hogy a login név mz23z42, míg a homedir TX28BZAA ami hozzá tartozik. :D

A legjobb egyébként egy sima `getent passwd` lenne és az azon való végigszaladás, de ekkor kell még egy ellenőrzés, hogy van e olyan directory a home alatt.

Köszönöm!

de egy valamit elfelejtettem, van a /home/profile, ahol annak root kellene, de a benne lévő
/home/profile/andras
/home/profile/andras.V2 -től
/home/profile/zsolt
/home/profile/zsolt.V2-ig is saját tulajdonra volna szükség.

ebben az esetben a kolléga megoldását használd a basename-el, valamint még egy sor a $(basename ... ).V2-vel
meg kell a grep -v V2 is, hogy kiszűrjük az ilyen könyvtárakat a keresésből, mer kb. ezek nem is kellenek, mert nincs V2-es user egy sem.

vagy

chown $i /home/profile/$i{,.V2}

Neeeem.

ls -d /home/* |grep -v profile | while read dir; do echo chown -R $(basename $dir) $dir; done

ez csak a home alatti mappákat fogja megnézni, rekurzív nem lesz és nem állítja a profile mappát, mert arra más jogok vonatkoznak

ezek után a profile mappába kell megcsinálni ugyanezt valahogy így:

ls -d /home/profile/* | grep -v V2 | while read dir; do echo chown -R $(basename $dir) $dir{,.V2}; done

Hát nagyjából ennyi....

Magam is megcsodáltam azt a felesleges echo-t. Gondolom, magának megírta a scriptet, s debugolni akarta, látni, hogy mi történik, de nyilván nem szerette volna, ha a saját gépén változik a tulajdonos. Így maradhatott ott az az echo.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Sikerült a profile-n kívül ahogy mondtad, echo nélkül:

ls -d /home/* |grep -v profile | while read dir; do chown -R $(basename $dir) $dir; done

Ez is mehet?! Nekem vége nem világos.. Van egy "andras" és egy "andras.V2", de minkettő andrásé
ls -d /home/profile/* | grep -v V2 | while read dir; do echo chown -R $(basename $dir) $dir{,.V2}; done

Azt mondd, milyen névszerkezetű home alkönyvtáraid vannak, s azok melyikének milyen tulajdonba kellene kerülnie. A másik, hogy az echo-t magam is javasolom, mielőtt lefuttatod a parancsot rendesen, mert így látni fogod, hogy mi történik majd a valós futtatásnál.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nem teszteltem le, de szerintem valami ilyesmi lesz belőle:

#!/bin/bash

loop() {
    while read; do
        [ ! -d "$REPLY" ] && continue
        if [ x"$REPLY" = x'profile' ]; then
            cd "$REPLY"
            loop
            cd ..
            continue
        fi
        owner="`cut -d. -f1 <<<\"$REPLY\"`"
        chown -R "$owner" "$PWD/$REPLY"
    done < <(ls -1)
}

cd /home
loop
exit 0

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Na ha már a két sor is bonyolult volt, akkor ez meg...rekurzív???? !!!!! :D :D :D

Én inkább kiadnám a két parancsot külön külön. :D

1. ls -d /home/* |grep -v profile | while read dir; do chown -R $(basename $dir) $dir; done
2. ls -d /home/profile/* | grep -v V2 | while read dir; do chown -R $(basename $dir) $dir{,.V2}; done

Így rekurzívan picit általánosabb. Azért nem átláthatatlan szerintem. :) Esetleg a process substitution lehet picit ijesztő, de ha az, lehet akár pipe-olni is. A pipe-pal az szokott a baj lenni, hogy külön process-ben fut, így a változók lokálisak lesznek, hiszen másik memóriaterületen kerülnek foglalásra. Ez néha igen kellemetlen tud lenni. Bár, ha jól látom, ez most nem okozna gondot.

a=a; echo b | read a; echo $a
a

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

...ez azért nem linux haladó....

1. mivel nem lesz olyan felhasználód hogy .V2, ezért a grep kiszedi ezeket a könyvtárakat a találati listájából az ls-nek
2. de ugye mivel a V2-esek valószínúleg a tulajdonában vannak (azonos a tulajdonosuk), így szeretnénk egyben az összes (ezt a basename paranccsal szedjük ugye ki) és valami.V2 könyvtárnak is a tulajdonosát rendbe tenni. Ezt teszi a {}-be foglalt rész.

Természetesen echo nem kell. Én azért írtam bele, mert először szeretem látni hogy mi fog történni, egyet kiadni a listából és ha jó, akkor az egészet lefuttatni. Rögtön ráereszteni bármit nem célszerű, lásd az eredeti problémádat ami valószínűleg így keletkezett.

Rögtön ráereszteni bármit nem célszerű, lásd az eredeti problémádat ami valószínűleg így keletkezett.

Visszanéztem az előzőkben kiadott parancsokat (csak update/upgrade), és semmi nem indolkolta ezt a jelenséget de még scripteket sem futtattam, így az okokban tanácstalan vagyok, de a lényeg, hogy most megy :)
és persze okulva ebből le is szedtem pár bash doksit.. na de jobb későn.. :)

Köszönöm mindenkinek a segítséget!

up!

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Mivel látom, hogy már megoldódott, így offtopikként csak szeretném megköszönni, szuper zh feladat lesz ebből :-)
(Illetve: Kedves Hallgató! Fejből oldja, ne itt keressen megoldást)