Datum: 2001-03-22
Quelle: suse-linux
Neuere Versionen von chmod können die Zugriffsrechte von Dateien nach denen einer Referenzdatei setzen
(Option --reference). Ältere Versionen konnten das noch nicht. Im Rahmen einer Diskussion über ein anderes
Thema (/etc/skel für bestehende Benutzer kopieren) kamen die folgenden 2 Lösungen zustande.
Im ersten Code-Teil wird in der Shell aus der ls-Ausgabe die Rechtemaske gebildet.
Der 2. Codeteil ist ein minimales Gerüst für ein kleines C-Programm. Zum Erzeugen eines ablauffähigen Programms startet man:
gcc -o getmod getmod.c oder
make getmod. Das kompilierte Programm kann dann so genutzt werden:
chmod `getmod musterdatei` datei.
### shell perms=`ls -l /etc/skel/ref_file | cut -c2-10` p_opt="u="`echo $perms | cut -c1-3 | tr -d '-'` p_opt=$p_opt",g="`echo $perms | cut -c4-6 | tr -d '-'` p_opt=$p_opt",o="`echo $perms | cut -c7-9 | tr -d '-'` # dann chmod wie folgt aufrufen: # call chmod like this: chmod $p_opt /path/to/file ### C /* getmod.c */ #include <sys/stat.h> int main (int argc, char *argv[]) { struct stat st; int rc= -1; const int bits = S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO; if (argc==2 && strlen(argv[1]) && !stat(argv[1], &st)) { printf ("%o\n", st.st_mode & bits); rc = 0; } return (rc); }
Im Shell-Script werden zuerst die Zeichen 2 bis 10 aus der Ausgabe des ls herausgeschnitten.
Das Ergebnis ist die Anzeige der Rechte: "rwx-r-xr-x". Als Nächstes werden nacheinander für den Eigentümer, die Gruppe und
"Other" die gesetzten Rechte extrahiert und alle "-" entfernt. Als Ergebnis entsteht eine für chmod
geeignete Angabe der Form "u=rwx,g=rx,o=rx".
Im C-Programm werden die Rechte per stat() ermittelt und direkt als Oktalzahl ausgegeben.