命令:sudo

sudo:
su:switch user,切换用户;
登录式切换:
su - USERNAME
su -l USERNAME
非登录式切换:
su USERNAME
非交互式切换:
su - USERNAME -c "SHELL_COMMAND"
su操作有缺陷:
如果使用root用户登录,切换至其他任何用户,均无需用户密码认证;
如果使用非root用户登录,企图切换至root用户,需要root用户的密码进行认证;

sudo命令:sudo, sudoedit — execute a command as another user
        以另一个用户的身份执行被授权指定的命令;大多数情况下,此处的另一个用户身份指的是root用户;

    授权机制;
        授权时,参考其配置文件以完成最终授权,配置文件的路径:
            /etc/sudoers

        对于此配置文件/etc/sudoers,共分为两类内容:
            1.别名的定义(aliases):用于定义基本变量;   //所有别名定义的名称全部字母必须是大写
            2.用户规格(user specification):也可以称为"授权项",包括哪些用户可以从哪些主机以哪些用户身份执行哪些操作的具体内容;在其中可以调用之前定义过的别名(变量);

        配置文件的格式:
            每行只能有一个授权项;其格式为:
                who  where=(whom) what

            //注意:通过编辑/etc/sudoers文件完成授权,而且所有通过此文件授权的操作都必须以sudo命令来启用执行;为了能够及时发现编辑的配置文件中是否存在语法错误,通常会使用visudo命令来编辑此配置文件;
                visudo:visudo — edit the sudoers file

            who:此次使用sudo授权的目标用户;
                username:单个用户账户的名称;
                #uid:单个用户账户的UID;
                %groupname:授权的目标是组,即指定组名所代表的组内所有用户账户;
                %#gid:授权的目标是组,即指定gid所代表的组内所有用户账户;
                User_Alias:事先定义过的用户账户的别名;

            where:定义被授权访问的客户端主机;
                ipaddress/hostname:单个主机;如果指定主机名,则必须能够被当前主机正确解析;
                Network Address:网络地址;
                    ipaddress/netmask
                    ipaddress/prefix
                Host_Alias:事先定义过的主机的别名;
                ALL:内建的特定别名,表示所有主机;

            whom:授权用户后续命令的执行者的真实身份,通常是root用户;
                username:单个用户账户的名称;
                #uid:单个用户账户的UID;
                Runas_Alias:事先定义过的命令执行者用户账户的别名;
                ALL:内建的特定别名,表示所有用户账户;

            what:此次被授权能够以whom身份执行的命令;
                command:单个命令;建议使用命令的绝对路径;
                directory:指的是指定目录下所有的命令;
                sudoedit:特殊命令;用于授权其他用户可以执行sudo命令,并且可以编辑修改/etc/sudoers文件的内容;
                Cmnd_Alias:事先定义过的命令的别名;
                ALL:内建的特定别名,表示所有命令;

基本的sudo授权示例:
    zhangsan        ALL=(root)      /usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel,/bin/passwd [a-zA-Z0-9]*,!/bin/passwd root          //禁止修改root密码的操作

定义别名的方法:
    Alias_Type ALIASNAME = item1, item2, ...
        Alias_Type:
            User_Alias;
            Host_Alias;
            Runas_Alias;
            Cmnd_Alias;

        ALIASNAME:别名的名称,必须全部使用大写字母;

    示例:
        User_Alias USERADMINS = tom, zhangsan, jerry, %lisi
        Cmnd_Alias USERADMINCMNDS = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel, /bin/passwd [a-zA-Z0-9]*, !/bin/passwd root

        USERADMINS  ALL=(root)  USERADMINCMNDS

    常用的标签:
        PASSWD:在执行被授权的特定命令之前,要求必须键入密码以事先身份验证;
        NOPASSWD:在执行被授权的特定命令之前,无需键入密码进行身份验证;

    示例:
        User_Alias USERADMINS = tom, zhangsan, jerry, suse, %lisi

        USERADMINS ALL=(root) NOPASSWD: /usr/sbin/useradd, PASSWD: /usr/sbin/usermod, /usr/sbin/userdel, /bin/passwd [a-zA-Z0-9]*, !/bin/passwd root

    注意:PASSWD、NOPASSWD等标签只能在授权项中使用,不能用于别名定义的语法;

    ***慎重注意:在使用sudo授权passwd,su,sudo,sudoedit,visudo等具有特殊意义的命令时,务必要考虑全面(例如禁止修改root用户的密码等操作)。***

猜你喜欢

转载自blog.51cto.com/chenliangdeeper/2119364