sudo详解

之前介绍过su的使用,su就是switch user,从一个用户切换到另一个用户

那么sudo是什么东东呢?

sudo:就是让某个用户能够以另外任意一个用户的身份通过某些主机执行某些任务。记住了,是以另外一个身份来执行命令,而不是切换到另一个用户上去哦!

但是要想让某个用户能够使用sudo来执行命令的话,必须要在sudo的配置文件定义才可以,只有在

/etc/sudoers中定义过的用户才可以执行相应的命令,这些命令也必须要在sudo的配置文件/etc/sudoers中定义才可以,默认情况下,只有root用户才可以使用sudo执行命令。

 

 

 

sudo的配置文件/etc/sudoers

刚刚说过,只有在/etc/sudoers中定义过的用户可以使用sudo命令,所以,要想让某些用户也能够使用sudo来执行某些命令,只需在/etc/sudoers中增加相应的sudo条目即可。

 

 

visudo管理sudo的配置文件

一般情况下,我们要想编辑某个配置文件,直接使用vim命令即可,但是由于使用vim编辑的配置文件无法检查增减条目的语法,因此我们一般不建议使用vim直接编辑。而是使用另外一种命令来编辑/etc/sudoers文件。

visudo:该命令默认情况下就是用来编辑/etc/sudoers文件的,该命令可以检查这个文件的语法错误,因此,如果要想修改/etc/sudors文件时,使用visudo来编辑更好,这样就不会出现什么问题了。

visudo -f filename:也可以用来编辑其他配置文件的,只要加上-f和指定文件即可。

 

sudo条目格式

who        which_host=(runas)        command

who:表示使用者账号。

which_host:表示登入者来源主机。ALL表示所有主机。

runas:表示以哪一个用户身份来执行,默认情况下,不加用户,表示以root身份来执行。

command:规范这个用户可以使用sudo执行哪些命令(这些命令要使用绝对路径)。ALL表示所有命令。

 

情景模拟一:要想让hadoop这个用户能够以root的身份来执行useradd,usermod命令,该如何实现?

1、默认情况下,只有root用户才有权限使用useradd,usermod命令的

wKioL1PsOmODTDlaAAChlNgznDc836.jpg

 

2、使用sudo以root身份来使用useradd命令添加用户

wKiom1PsOY7gc5MHAACxVY1MMUg008.jpg

 

3、在/etc/sudoers中添加一个sudo条目

wKiom1PsOgGCHicOAAEFMs1ZLss662.jpg

 

4、再次使用sudo以root身份来添加用户

wKioL1PsO0Djaj-4AAHTKdxaKxg371.jpg

 

5、使用sudo以root身份来删除xsl用户

wKiom1PsOzmTyHwkAADuFhT9_Ao323.jpg

 

注意:在上述这个过程中,每次执行命令时都要输入密码,这是因为如果某个用户有事离开了但是却没有退出当前用户,这时任何一个用户就可以在此主机上执行任何命令,修改root密码,或者删除有关信息等等,这对于系统来说是极不安全的。因此在每次执行命令前,都需要输入当前用户自身的密码,该密码有效期为5分钟(5分钟内执行任何命令不需要输入密码),5分钟过后就要重新输入了。

 要想在执行某些命令时,不需要输入密码,可以在某些命令前加上"NOPASSWD:"等TAG信息

例如:hadoop        ALL=(root)    NOPASSWD: /usr/sbin/useradd

 

 

禁止修改root用户的密码

注意:在增加某个条目时,如果规定了某个用户可以执行修改密码的命令时,也就是该用户可以执行/usr/bin/passwd这个命令,对于root用户来说,其密码是不能随便修改的。要去掉修改root账号密码的命令。使用!来取反。这样一般用户就不能修改root的密码了。

以hadoop这个sudo条目为例:

hadoop        ALL=(root)        /usr/bin/passwd  [A-Za-z]*,!/usr/bin/passwd root

 /usr/bin/passwd  [A-Za-z]*:表示在执行passwd命令时,需要输入修改的账号名,因为如果不加账号名,默认修改的也是root的密码,因此这也是不可以的。

 

为sudo条目定义命令别名

有时候如果某些用户需要执行相同的命令,如果一个一个的为他们添加sudo条目时,会比较麻烦。这时我们可以为某些用户或者某些命令创建别名,以别名的方式为他们添加sudo条目,这样就方便多了。

在定义别名时必须别名名称只能是大写英文字母

可以为sudo条目中的每一个字段定义一个别名。

如何定义别名:

定义用户别名:

格式:User_Alias   aliasname=

            aliasname可以是用户名、组名(使用%引导)、还可以包含其他的用户别名(嵌套)

 

定义主机别名

格式:Host_Alias    aliasname=

            aliasname可以是主机名、ip-addr、网络地址、其他主机别名(嵌套)

 

定义执行身份别名

格式:Runas_Alias  aliasname=

            aliasname可以是用户名、组名(前面加上%)、其他Runas别名(嵌套)

 

执行命令别名

格式:Cmnd_Alias  aliasname=

         aliasname可以是命令路径(绝对路径)、目录(此目录内的所有命令)、其他事先定义过的别名

        

 

情景模拟二:有3个用户,hadoop、xsl、test都可以执行useradd、passwd命令,该如何操作?

可以在/etc/sudoer中添加如下条目即可:

User_Alias USERALIAS=hadoop,xsl,test
Cmnd_Alias CMDALIAS=/usr/sbin/useradd,!/usr/bin/passwd root,/usr/bin/passwd [A-Za-z]*
USERALIAS   ALL=(root)  CMDALIAS

 

 

 当然可以使用sudo -l来查看当前用户可以使用sudo来执行的哪些命令。