• 1011Linux用户管理规则及用户管理函数



    用户管理:
    useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage


    组管理:
    groupadd, groupdel, groupmod, gpasswd

    权限管理:
    chown, chgrp, chmod, umask

    /etc/passwd:
    用户名:密码:UID:GID:注释:家目录:默认SHELL


    /etc/group:
    组名:密码:GID:以此组为其附加组的用户列表


    /etc/shadow:
    用户名:密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告时间:非活动时间:过期时间:


    用户管理:
    useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage




    useradd  [options]  USERNAME 
    -u UID
    -g GID(基本组)
    -G GID,...  (附加组)
    -c "COMMENT"
    -d /path/to/directory
    -s SHELL
    -m -k
    -M
    -r: 添加系统用户

    /etc/login.defs

    环境变量:
    PATH
    HISTSIZE
    SHELL


    /etc/shells:指定了当前系统可用的安全shell



    userdel:
    userdel [option] USERNAME
    -r: 同时删除用户的家目录


    id:查看用户的帐号属性信息
    -u
    -g
    -G
    -n


    finger: 查看用户帐号信息
    finger USERNAME


    修改用户帐号属性:
    usermod
    -u UID 
    -g GID
    -a -G GID:不使用-a选项,会覆盖此前的附加组;
    -c
    -d -m:
    -s
    -l
    -L:锁定帐号
    -U:解锁帐号

    chsh: 修改用户的默认shell


    chfn:修改注释信息


    密码管理:
    passwd [USERNAME]
    --stdin
    -l
    -u
    -d: 删除用户密码


    pwck:检查用户帐号完整性




    组管理:
    创建组:groupadd
    groupadd 
    -g GID
    -r:添加为系统组

    groupmod
    -g GID
    -n GRPNAME


    groupdel


    gpasswd:为组设定密码


    newgrp GRPNAME <--> exit




    文件的访问权限说明:

        相关的ID:实际用户ID实际组id,有效用户id,有效组id,附加组id,保存的设置用户id,保存的设置组id
        实际用户id和实际组id:用于表示当前LInux的登录用户,在会话中并不会改变,只有在使用sudo等命令时会暂时发生改变。
        有效用户id,有效组id,附加组id:用于确定每个文件的访问组权限,保存在stat结构体中的st_mode分量中。
        S_IRUSR:用户读
        S_IWUSR:用户写
        S_IXUSR:用户执行
        S_IRGRP:组读
        S_IWGRP:组写
        S_IXGRP:组执行
        S_IROTH:其他用户读
        S_IWOTH:其他用户写
        S_IXOTH:其他用户执行
        保存的设置组id和保存的设置用户id:保存了该用户的有效组id和有效用户id的一个副本
    测试文件访问权限函数:
        #include <unistd.h>
        int access(const char *pathname, int mode);
        
        umask函数:
        mode_t umask(mode_t cmode);

        chmod函数和fchmod函数:
        umask函数只能在创建文件的时候给定文件的权限,而chmod和fchmod函数可以修改已经存在的文件的权限。chmod可以在任何时候修改指定文件的权限,而fchmod需要在文件被打开后使用文件描述符来修改。
        #include <sys/types.h>
        #include <sys/stat.h>
        int chmod(const char *filename, mode_t mode);
        int fchmod(int fd, mode_t mode);
        修改文件的用户ID和用户组ID:chown,fchown,lchown

        rename函数:
        #include <stdio.h>
        int rename(const char *oldname, const char *newname);
    文件的其他高级操作函数:
        1.    #include <unistd.h>
              int dup(int fd);
              int dup2(int fd, int fd2);
        2.    #include <sys/types.h>
            #include <unistd.h>
            #include <fcntl.h>
            int fcntl(int fd, int cmd, int arg);
            第二个参数:
            F_DUPD:返回大于或等于arg的最低序号的文件描述符。该功能可以由dup函数实现。新的文件描述符与旧的可以互换使用。调用成功时,返回值为新的文件描述符。        
            F_GETFD:获得close-on-exec标志。如果最后一位是0,则该标志没有设置。返回值为0或1.
            F_SETFD:设置close-on-exec标志为指定的值arg(只有最后一位有效,为0或1)
            F_GETFL:获得文件的打开方式。返回所有的标志位,标志位的含义与open函数中相同。
            F_SETFL:设置文件打开的方式的标志。设置文件打开方式为arg指定的打开方式。仅能设置O_APPEND和O_NONBLOCK或O_NDELAY,有的系统还可以设置O_SYNC,该标志被所有的文件描述符所共享。
            F_GETLK:获得本进程得到锁的第一个锁的flock结构。
            F_SETLK:获得离散的文件锁,不等待。
            F_SETLKW:获得离散的文件锁,必要时等待。
            F_GETOWN:返回当前接受SIGIO或SIGURG信号(signal)的进程ID或进程组。进程ID以负值返回。
            F_SETOWN:设置进程或进程组接受SIGIO和SIGURG信号,进程组ID以负值返回。进程ID以正值指定。
        文件锁:在文已经共享的情况下如何操作,也就是当多个进程同时操作同一个文件时,我们怎么保证文件数据的正确性。linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态。

                   文件锁包括建议性锁和强制性的锁。建议性的,顾名思义,相对温柔一些,在对文件进行锁操作时,会检测是否已经有锁存在,并且尊重已有的锁。在一般的情况下,内核和系统都不使用建议锁。强制性的锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他进程对其进行读写操作。采取强制性的锁对性能的影响很大,每次进行读写操作都必须检查是否有锁存在。
        fcntl函数返回文件状态标志:
            O_RDONLY:只读
            O_WRONLY:只写
            O_RDWR:读写
            O_APPEND:每次写时追加
            O_NONBLOCK:非阻塞模式
            O_SYNC:等待数据和属性写完成
            O_DSYNC:等待数据写完成
            O_RSYNC:同步读写
            O_FSYNC:等待写完成
            O_ASYNC:异步I/O操作
        truncate和ftruncate函数:
        #include <unistd.h>
        int truncate(char *filepath, size_t len);
        int ftruncate(int fd, size_t len);

        remove函数:
        #include <stdio.h>
        int remove(const char *pathname);

    目录文件操作:
        mkdir和rmdir
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <unistd.h>
        int mkdir(const char *pathname, mode_t mode);//创建一个目录
        int rmdir(const char *pathname);//删除一个目录
        int chdir(const char *pathname);//改变工作路径
        int fchdir(int fd);//改变文件工作路径
        char *getcwd(char *buf, size_t size);//获取文件的完整路径
        #include <dirent.h>
        DIR *opendir(const char *pathname);//打开目录,返回的是一个DIR指针,是一个内部结构,用来保存被度的目录的有关信息。
        int close(DIR *dp);//关闭目录,参数是一个内部结构指针
        struct dirent *readdir(DIR *dp);//读目录,返回一个目录dirent结构体指针。
        struct dirent
        {
        ino_t d_ino;//i-node number
        char d_name[NAME_MAX+1];//null-terminated filename
        };
        
        
       
    起风了,努力生存
  • 相关阅读:
    三次请求(读-改-读)引出nibernate 一级缓存
    算法竞赛入门经典第一、二章摘记
    uva 10905 Children's Game
    uva 11205 The broken pedometer
    uva 10160 Servicing stations
    uva 208 Firetruck
    uva 167 The Sultan's Successors
    zoj 1016 Parencodings
    uva 307 Sticks
    uva 216 Getting in Line
  • 原文地址:https://www.cnblogs.com/StivenYang/p/8441330.html
Copyright © 2020-2023  润新知