chmod hax

Van egy ilyen parancsom:
find /itten/ni -type f --exec chmod 644 {} \;
find /itten/ni -type d --exec chmod 755 {} \;

Ez ugye minden fajlra 644 es minden konyvtarra 755 jogot rak. Namost minden fajlnak es konyvtarnal lekell futtatni a chmod, ez nemepp optimalis. Foleg ha 100k fajlt kell modositani (vagy megtobbet). Lehetne szorakozni az xargs-al, de akkor meg figyelni kell space tartalmazo nevekre. aztan meg igyis min ketszer vegig kell jarni az osszes konyvtarakat. Kellett valami jobb megoldas.

Kicsit meghaxoltam a chmod forrasat. Kapott ket uj kapcsolod: dironly es fileonly. ha be van kapcsolva valamelyik, akkor a tenyleges chmod csak akkor hajtodik vegre ha fajl/konyvtar az adott nev. Persze a konyvtarbejarastol (-R) ez fuggetlen.

Igy a fenti ket parancs:
chmod -F -R 644 /itten/ni
chmod -D -R 755 /itten/no

Es gyorsabb is lett ;)

Patch: itten

Hozzászólások

lulz!

chmod -R u=rwX,g=rwX,o=rX

ha mar ott jartal el is olvashattad volna mit csinal, te linugz hekker

--
Segmentation violation -- Core dumped blues

Tehat:


$ ls -lR
.:
total 4
drwxrwxrwx 2 bandi bandi 4096 2008-04-03 13:19 test
-rwxrwxrwx 1 bandi bandi    0 2008-04-03 13:17 test2

./test:
total 0
-rwxrwxrwx 1 bandi bandi 0 2008-04-03 13:19 test3

Ebbol szeretnem, hogy a fajlok 644, konyvtarak 755 legyenek. (vagy barmit, csak konyvtarnak != fajloknak)
a te parancsod mindenkitol leveszi az uccso w-t. akkor hogy is lenne helyes?

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Egy find -al.
find . \( -type f -a -exec chmod 644 {} \; \) -o \( -type d -a -exec chmod 755 {} \; \)

Igy is ket chown kell , es ketszer kell keresni. :(. Ha mar modositasz akkor valami egy chown -os megoldast kene megprobalni, MODE reszbe kene bepiteni szvsz.

Hmm jonak tunik... fenti kiindulo allapot (mindenkinek 777 van):


$ chmod -R a-x,u=rwX,g=rX,o=rX *
$ ls -lR
.:
total 4
drwxr-xr-x 2 bandi bandi 4096 2008-04-03 13:19 test
-rw-r--r-- 1 bandi bandi    0 2008-04-03 13:17 test2

./test:
total 0
-rw-r--r-- 1 bandi bandi 0 2008-04-03 13:19 test3

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

nemjo. leveszed az x jogot, utana mar nemtudsz belepelni a konyvtarba:


$ chmod -R a-x *
chmod: `test': Permission denied
$ ls -lR
.:
total 4
drw-rw-rw- 2 bandi bandi 4096 2008-04-03 13:19 test
-rw-rw-rw- 1 bandi bandi    0 2008-04-03 13:17 test2

./test:
total 0
?--------- ? ? ? ?                ? ./test/test3

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

nemkell postorder. a fenti a-x,u=rwX,g=rX,o=rX beirasod jonak tunik (bar ezzel meg mindig nemlehet kulonbozo rw jogokat adni fajloknak es konyvtaraknak). viszont erdekelne, milyen esetben nemlehet 1 chmoddal megoldani?

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

szal lényeg a lényeg, küldd be a patch-et. általános esetben jól jöhetne az a plusz szűrés.

Minden mode sztring , ha D vel kezdodik akkor csak konyvtarakra vonatkozik, ha F -el akkor csak filokra, ha nincs megadva (massal kezdodik) akkor mindketore.
D777,F000 megadas is lehetseges legyen szerintem.

Erdemes lenne megondolni, mas tipusok felismereset is.

-R preorder.
-r postorder bejarast jelenthetne.
-Rr pedig , azt jelentene, hogy konyvtarak jogait, ha ugy bovitjuk, hogy abba be lehesen lepni akkor pre, ha csokentjuk, hogy ne lehessen akkor post.

hat ehhez mar keves vagyok :(
majd Replaced megcsinalja, ugyis olyan pro hacker ;]

a pre/post orderrel az a gond, hogy a chmod igy csinalja:


fts_open(fajl)
while fts_read() {
  chmod()
  if (!recurse)
    fts_set(SKIP)
}
fts_close()

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!


find /valahol -type d -print0 | xargs -0 chmod 755
find /valahol -type f -print0 | xargs -0 chmod 644

Ez mondjuk asszem nem teljesen cross-platform, es kicsit tobb chmod fut, mint a patchelt verzio, de rendszeresen hasznalom 50k filera, es gyakorlatilag 0 ido alatt le is fut.

Nem, az xargs tobbszor futtatja a parameterben adott parancsot, ha tul hosszu volna az argumentlista, erre valo. Ha nem tenne, ugyanaz lenne a

foo | xargs bar

, mint a

bar `foo`

. Nyilvan emiatt is futna tobb chmod, mint a patchelt esetben, de itt a lenyeg arrol szol, hogy 50000 fork/exec vagy 50. Az xargs (jo, ez is GNU) manual elso mondata:

xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times with any initial-arguments followed by items read from standard input.

Gyors teszt nalam: 41545 file-ra 24 chmod-ot futtatott.


$ time find . -type f -print0 | strace -o /tmp/strace.out -e process xargs -0 chmod 664

real	0m1.289s
user	0m0.493s
sys	0m1.560s
$ grep clone /tmp/strace.out | wc -l
24
$ find . -type f -print | wc -l
41545