自己动手写shell之chgrp,chown,chmod

1.chgrp实现

#include <grp.h>
#include <unistd.h>

void chgrp(char * groupname,char * filename)
{
    struct group * groupinfo = NULL;
    if((groupinfo = getgrnam(groupname)) == NULL)
    {
        printf("groupname does not exist\n");
        return;
    }

    if(access(filename,F_OK) != 0)
    {
        printf("file %s does not exist\n",filename);
        return;
    }

    int gid = groupinfo->gr_gid;
    chown(filename,-1,gid);
    printf("the group id of the file has been changed successfully\n");
}

2.chown实现

void chowner(char * ownername,char * filename)
{
    struct passwd *password_info = NULL;
    if((password_info = getpwnam(ownername)) == NULL)
    {
        printf("username does not exist\n");
        return;
    }
    if(access(filename,F_OK) != 0)
    {
        printf("file %s does not exist\n",filename);
        return;
    }
    int uid = password_info->pw_uid;
    chown(filename,uid,-1);
    printf("the user id of the file has been changed successfully\n");
}

3.chmod实现

void _chmod(char * mod,char * filename)
{
    if(access(filename,F_OK) != 0)
        {
            printf("the file %s does not exist",filename);
            return;
        }

    int len = strlen(mod);
    switch(len)
        {
            case 1:
            {
                int a;
                a = mod[0] - '0';
                mode_t mode = 0;
                if(a < 0 || a > 7)
                    {
                        printf("octal number out of range\n");
                        return ;
                    }
                if(a & 0x04)
                    mode = mode | S_IROTH;
                if(a & 0x02)
                    mode = mode | S_IWOTH;
                if(a & 0x01)
                    mode = mode | S_IXOTH;
                chmod(filename,mode);
                printf("the mode has been changed successfully\n");
                break;
            }
            case 2:
            {
                int a,b;
                mode_t mode = 0;
                a = mod[0] - '0';
                b = mod[1] - '0';

                if(a < 0 || a > 7 || b < 0 || b > 7)
                    {
                        printf("octal number out of range\n");
                        return ;
                    }

                if(b & 0x04)
                    mode = mode | S_IROTH;
                if(b & 0x02)
                    mode = mode | S_IWOTH;
                if(b & 0x01)
                    mode = mode | S_IXOTH;

                if(a & 0x04)
                    mode = mode | S_IRGRP;
                if(a & 0x02)
                    mode = mode | S_IWGRP;
                if(a & 0x01)
                    mode = mode | S_IXGRP;
                chmod(filename,mode);
                printf("the mode has been changed successfully\n");
                break;
            }
            case 3:
            {
                int a,b,c;
                mode_t mode = 0;
                a = mod[0] - '0';
                b = mod[1] - '0';
                c = mod[2] - '0';

                if(a < 0 || a > 7 || b < 0 || b > 7 || c < 0 || c > 7)
                    {
                        printf("octal number out of range\n");
                        return ;
                    }

                if(a & 0x04)
                    mode = mode | S_IRUSR;
                if(a & 0x02)
                    mode = mode | S_IWUSR;
                if(a & 0x01)
                    mode = mode | S_IXUSR;

                if(b & 0x04)
                    mode = mode | S_IRGRP;
                if(b & 0x02)
                    mode = mode | S_IWGRP;
                if(b & 0x01)
                    mode = mode | S_IXGRP;

                if(c & 0x04)
                    mode = mode | S_IROTH;
                if(c & 0x02)
                    mode = mode | S_IWOTH;
                if(c & 0x01)
                    mode = mode | S_IXOTH;
                chmod(filename,mode);
                printf("the mode has been changed successfully\n");
                break;
            }
            default:
            {
                int a,b,c,d;
                mode_t mode = 0;
                a = mod[len-4] - '0';
                b = mod[len-3] - '0';
                c = mod[len-2] - '0';
                d = mod[len-1] - '0';

                if(a != 0 || b < 0 || b > 7 || c < 0 || c > 7 || d < 0 || d >7)
                    {
                        printf("octal number out of range\n");
                        return ;
                    }

                if(b & 0x04)
                    mode = mode | S_IRUSR;
                if(b & 0x02)
                    mode = mode | S_IWUSR;
                if(b & 0x01)
                    mode = mode | S_IXUSR;

                if(c & 0x04)
                    mode = mode | S_IRGRP;
                if(c & 0x02)
                    mode = mode | S_IWGRP;
                if(c & 0x01)
                    mode = mode | S_IXGRP;

                if(d & 0x04)
                    mode = mode | S_IROTH;
                if(d & 0x02)
                    mode = mode | S_IWOTH;
                if(d & 0x01)
                    mode = mode | S_IXOTH;
                chmod(filename,mode);
                printf("the mode has been changed successfully\n");
                break;
            }
        }
}
时间: 2024-12-30 09:26:20

自己动手写shell之chgrp,chown,chmod的相关文章

15、Linux 文件基本属性chgrp,chown,chmod

Linux文件属主和属组 更改文件属性 1.chgrp:更改文件属组 语法: chgrp [-R] 属组名文件名 参数选项 -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改. 2.chown:更改文件属主,也可以同时更改文件属组 语法: chown [–R] 属主名 文件名 chown [-R] 属主名:属组名 文件名 3.chmod:更改文件9个属性 Linux文件属性有两种设置方法,一种是数字,一种是符号.Linux文件的基本权

每天一个linux命令(21):chgrp,chown,chmod

这三个命令都是改变文件属性与权限的,就放一起写了 charp:改变文件所属用户组 chown:改变文件所属者 chmod:改变文件的权限 一个文件对于owner,group ,others有不同的权限,chmod就是用来改变权限的 ,每种身份都有三个权限,分别是r,w,x 各权限的分数为r:4 w:2 x:1 ,可以累加 比如当权限为rwx时就为7 所以改变权限最简单的方法为 chmod 777 filename 原文地址:https://www.cnblogs.com/wangshaowei/

自己动手写shell命令之write

Linux下write命令允许用户跟其他终端上的用户对话.用c语言实现shell命令write,代码如下: #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <utmp.h> #include <pwd.h> #include <sys/types.h> #include <stdlib.h> #include <sys/stat.h

自己动手写shell命令之du

du命令可以查看指定文件夹占用的磁块数,以下为linux下c语言实现shell du指令的代码(支持-k选项): #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <string.h> int disk_usage(char *); int k = 0; int main(int argc,char * argv

自己动手写shell命令之ls -R1fF

ls命令的R参数代表递归的列出所有子文件夹中的所有文件,1表示每一行只显示一个文件或文件夹,f表示不排序即输出,F表示在每项的输出的最后根据其文件类型相应的加上*/=>@|字符.通过c语言实现ls -R1fF命令的效果,其源代码如下: #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <pwd.h> #in

自己动手写shell命令之who

思路:在unix系统中有一个名为utmp的文件,里面存着当前登录到系统中用户的信息.utmp这个文件里面保存的是结构数组,数组元素是utmp类型的结构.实现who命令,只要依次从utmp文件中读出utmp类型的结构体,然后通过合适的方式将它显示出来即可.如果每一次只从文件里面读一个结构体数据,那么每一个结构体都要进行依次系统调用.而又因为系统调用比较耗时(涉及到用户态到核心态的切换),所以这样会造成程序低效.我们使用缓冲技术,每次从文件中读若干结构体数据到内存中,当这些数据都已经显示在终端后,我

自己动手写shell命令之ls

linux下ls命令(支持-R參数)的c语言实现: #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <pwd.h> #include <grp.h> #include <string.h> void do_ls(char *); void do_stat(char *,char *);

自己动手写shell命令之pwd

思路:(1)得到"."的i节点号,称其为n(使用stat) (2)chdir ..(使用chdir) (3)找到inode号为n的节点,得到其文件名. 重复上述操作直到当前目录"."的inode值等于".."的inode值 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> ino_t

自己动手写shell命令之more

unix下more命令的简单实现: #include <stdio.h> #define PAGELEN 24 #define LINELEN 512 int do_more(FILE * file); int see_more(FILE * file); int main(int argc,char * argv[]) { FILE * fp; if(argc == 1) do_more(stdin); else { int argv_index = 1; while(argc > 1