自己动手写shell之chgrp,chown,chmod
shell 自己 动手 chmod chown
2023-09-14 09:10:26 时间
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; } } }
相关文章
- shell脚本--制作自己的服务脚本
- 重新点亮shell————awk函数[十五]
- hbase:用于实现版本文件及配置同步的两个shell脚本
- 使用shell脚本运行scala
- linux中用shell获取昨天、明天或多天前的日期
- [转]PHP与Shell交互
- Shell脚本登录网络设备并执行dis cu
- shell常用命令总结
- Shell脚本实战之文件批量创建和修改
- Hadoop(5):HDFS的Shell操作
- Shell全解析(三):Shell脚本程序
- shell函数及返回值
- shell脚本并发控制详解
- 【看表情包学Linux】shell 命令及运行原理 | Linux 权限 | 文件权限的修改和转让 | 目录的权限 | Sticky bit 粘滞位