Zugriffsrechte für Dateien setzen

Datum: 2001-03-22
Quelle: suse-linux

Worum ging es?

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.

Code
### 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 &amp; bits);
    rc = 0;
  }
  return (rc);
}
Beschreibung

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.