|
![ein Kapitel weiter](../weiter.gif)
Mit dem Systemaufruf chmod können sie, wie auch mit dem gleichnamigen
Shellkommando, die Zugriffsrechte auf einer Datei ändern. Vorrausgesetzt
natürlich, der Prozess hat die Benutzererkennung 0 (root) oder die
Benutzererkennung entspricht dem Eigentümer der Datei. Hier der Syntax
zu chmod.....
#include <sys\stat.h> //MS-DOS
#include <sys\types.h> //MS-DOS
#include <io.h> //MS-DOS
#include <sys/stat.h> //Linux/Unix
#include <sys/types.h> //Linux/Unix
int chmod(const char *pfad, int modus);
Die Funktion gibt bei Erfolg 0 und bei Fehler -1 zurück. Für den Modus gelten in UNIX/LINUX folgende Konstanten die in <sys/stat.h> deklariert sind...
Konstante |
Bedeutung |
S_IRUSR |
read(user; Leserecht für Eigentümer) |
S_IWUSR |
write(user; Schreibrecht für Eigentümer) |
S_IXUSR |
execute(user; Ausführrecht für
Eigentümer) |
S_IRWXU |
read,write,execute(user;
Lese-,Schreib-,Ausführungsrecht für Eigentümer) |
S_IRGRP |
read(group; Leserecht für Gruppe) |
S_IWGRP |
write(group; Schreibrecht für Gruppe) |
S_IXGRP |
execute(group; Ausführungsrecht für
Gruppe) |
S_IRWXG |
read,write,execute(group;
Lese-,Schreib,-Ausführungsrecht für Eigentümer) |
S_IROTH |
read(other; Leserecht für alle anderen
Benutzer) |
S_IWOTH |
write(other; Schreibrecht für alle anderen
Benutzer) |
S_IXOTH |
execute(other; Ausführungsrecht für alle
anderen Benutzer) |
S_IRWXO |
read,write,execute(other;
Lese-,Schreib-,Ausführungsrecht für alle anderen Benutzer) |
Und unter DOS haben sie folgende 2 Möglichkeiten die in <sys\stat.h> deklariert sind...
Konstante |
Bedeutung |
S_IWRITE |
Schreiben erlauben |
S_IREAD |
Lesen erlauben |
Nun noch 2 Programme. 1 für UNIX/LINUX und eins für DOS. Zuerst für LINUX. Wir schreiben ein Programm mit dem sie alle Programme die sie in der Kommandozeile eingeben, Leserechte für alle anderen erteilen (nur lesbar für alle anderen Benutzer).....
/*Download:chmod1.c*/
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc == 1)
{
fprintf(stderr,"Geben sie mindestens eine Datei an!!!\n");
exit (1);
}
while(*++argv)
{
printf("%s : ",*argv);
if(chmod(*argv, S_IROTH) == -1)
printf("...nicht lesbar fuer alle anderen!!\n");
else
printf("Leserecht für alle gesetzt!!\n");
}
return 0;
}
|
Das selbe nun auch für DOS. Alle Dateien der Kommandozeile werden Versucht nur Leserechte zu erteilen.....
/*Download:chmod2.c*/
#include <sys\stat.h>
#include <sys\types.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc == 1)
{
fprintf(stderr,"Geben sie mindestens eine Datei an!!!\n");
exit (1);
}
while(*++argv)
{
printf("%s : ",*argv);
if(chmod(*argv, S_IREAD) == -1)
printf("...nicht lesbar fuer alle anderen!!\n");
else
printf("Leserecht für alle gesetzt!!\n");
}
return 0;
}
|
Diese Beispiele sind natürlich belanglos. Unter Linux/Unix sind sie chmod
ja folgendermaßen gewohnt....
Wir wollen einer Datei jedliche Schreibrechte wegnehmen. Wir machen
dies in der Shell entweder so.....
chmod a-w programmname
...oder als oktale Darstellung...
chmod 0444 programmname
Nun hat niemand mehr Schreibrecht auf diese Datei. Nun wollen wir uns
die 2.Möglichkeit ansehen wie wir dies in einem C-Programm realisieren
können. Also.......
mychmod 0444 programmname1 programmname2 programmname3 ...... programmnamen
Das einzige Problem dürfte in diesem Fall sein den "oktalen" String
in einem int-Wert umzuwandeln. Folgendermaßen sind die Zugriffsrechte
in der Headerdatei /usr/include/linux/stat.h deklariert.......
#define S_IRWXU 00700 (Dezimal 448)
#define S_IRUSR 00400 (Dezimal 256)
#define S_IWUSR 00200 (Dezimal 128)
#define S_IXUSR 00100 (Dezimal 64)
#define S_IRWXG 00070 (Dezimal 56)
#define S_IRGRP 00040 (Dezimal 32)
#define S_IWGRP 00020 (Dezimal 16)
#define S_IXGRP 00010
#define S_IRWXO 00007 (Dezimal 7)
#define S_IROTH 00004 (Dezimal 4)
#define S_IWOTH 00002 (Dezimal 2)
#define S_IXOTH 00001 (Dezimal 1)
Die Dezimalwerte wurden von mir angefügt. Wie könne wir praktisch jetzt
einen "oktalen" String in diese dezimale Werte kovertieren......
int oct2int(char *o_string)
{
int rechte;
for(rechte=0; *o_string>='0' && *o_string <='7'; *o_string++)
rechte = (rechte * 8) + (*o_string - '0');
return rechte;
}
Sie können die Rechnung gerne auf einem Blatt Papier nachvollziehen.
Jetzt das Programm mychown dazu.......
/*Download:mychmod.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
int oct2int(char *o_string)
{
int rechte;
for(rechte=0; *o_string>='0' && *o_string <='7'; *o_string++)
rechte = (rechte * 8) + (*o_string - '0');
return rechte;
}
int main(int argc, char *argv[])
{
int permissions;
int i;
if(argc < 3)
{
fprintf(stderr, "Verwendung : %s Rechte(oktal) programmname ...\n");
exit(0);
}
permissions = oct2int(argv[1]);
for(i=2; argv[i]!=NULL; i++)
{
if( chmod(argv[i], permissions) == -1)
fprintf(stderr, "Konnte Zugriffsrechte für %s nicht ändern\n",argv[i]);
}
return 0;
}
|
Mit diesem kurzem Programm können sie wie mit chown die Zugriffrechte für
mehrer Dateien gleichzeitig ändern.
Des weiteren gibt es für Linux/Unix noch die Funktion fchmod womit die Zugriffsrechte einer bereits geöffneten Datei mit dem Filedeskriptor geändert werden kann....
int fchmod(int fd, mode_t modus);
Der Unterschied zwischen chmod und fchmod ist das die Zugriffsrechte bei chmod geändert werden können bei einer nicht geöffneten Datei und bei fchmod auf eine bereits mit dem Filedeskriptor geöffnete Datei.
![ein Kapitel weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|