su和sudo这两个命令是linux运维必须要会的,通常在生产环境中都是使用普通帐号来登录,再使用su或sudo来执行一些管理命令。
su:run a shell with substitute user and group ids
-,-l,--login 切换后使用指定用户的的shell。
[root@ns2 ~]# su - user4
[user4@ns2 ~]$ // 这里的shell环境是user4的
[user4@ns2 ~]$ exit
logout
[root@ns2 ~]# su -l user4
[user4@ns2 ~]$
[user4@ns2 ~]$ exit
logout
[root@ns2 ~]#
-c,--command=COMMAND 可以在不切换当前shell的情况下,用指定的用户来执行一个命令;
[root@ns2 ~]# su user4 -c 'whoami'
user4
[root@ns2 ~]#
如果在su的时候没有加”-“或“-l”或“--login”那么默认的会使用当前用户的shell来执行;
sudo的配置文件是:/etc/sudoers,该文件可以定义哪个用户可以在哪个机器上以哪个用户的身份来执行哪些命令;
在配置sudo时必须使用visudo来编辑配置文件,因为使用visudo可以检查修改后的文件的语法是否正确;
who where=(run_as) /path/to/command1,…
可以将上面的配置行分成四部分:part1 part2 part3 part4
例如:
xfzhou 192.168.1.0/24=(root) /usr/sbin/useradd,/usr/sbin/usermod
xfzhou ALL=(root) /usr/sbin/setup
那么如果用户的数量过多的时候是不是要为每个用户来创建一个条目呢,很显示这样做是不科学的。所以sudo就引入了别名的概念,其实和组也差不多;
alias定义的语法:
Alias_Type NAME = item1,item2,…
要注意的是,这个Alias的名称一定要大写;
User_Alias ADMIN = user1,%user2
user1是一个用户,user2是一个组,所以user2的前面要加上%
Host_Alias PERMIT = www.xfzhou.com,192.168.10.40,192.168.20.0/24
可以使用主机名,IP地址,网段(网段的掩码可以写成255.255.255.0,也可以写成/24)
Cmnd_Alias CREATEUSER = /usr/sbin/useradd,/user/sbin/usermod
命令必须使用绝对路径。如果只指定了一个目录,那么用户就可以执行该目录下的所有的文件;上面的“=”右边的都可以使用“!”来取反。表示除了xxx以外;
例子:请允许user1,user2,user3在192.168.20.44和192.168.10.0/24网段的机器上使用sudo切换到root用户来执行useradd和setup命令;
#test for sudo
User_Alias TEST_USERS = user1,user2,user3
Host_Alias PERMIT_HOST = 192.168.10.0/24,192.168.20.44
Cmnd_Alias CREATEUSER = /usr/sbin/useradd,/usr/sbin/setup
TEST_USERS PERMIT_HOST=(root) CREATEUSER
然后就可以使用user1,user2,user3这三个用户去测试了;
[user1@ns2 ~]$ sudo -l
Matching Defaults entries for user1 on this host:
requiretty, !visiblepw, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS MAIL PS1 PS2
QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME
LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Runas and Command-specific defaults for user1:
User user1 may run the following commands on this host:
(root) /usr/sbin/useradd, /usr/sbin/setup
[user1@ns2 ~]$
注意:当用户第一次执行sudo命令的时候是需要用户输入自己的密码的。当第一次输入正确后,这个密码就会被缓存5分钟,在5分钟内用户再次使用sudo来切换身份执行命令的时候就不需要再次输入自己的密码。
这样呢有些时候会有一个安全隐患,所以为了去掉这个5分钟,可以在使用sudo命令的时候加上“-k”参数,这样用户在每次执行sudo命令的时候都会让用户输入自己的密码。
如果想让某个用户在执行sudo的时候不需要输入自己的密码,那么可以在命令的前面添加NOPASSWD。/etc/sudoers的内容如下:
#test for sudo
User_Alias TEST_USERS = user1,user2,user3
Host_Alias PERMIT_HOST = 192.168.10.0/24,192.168.20.44
Cmnd_Alias CREATEUSER = /usr/sbin/useradd,/usr/sbin/setup
TEST_USERS PERMIT_HOST=(root) NOPASSWD:CREATEUSER
这样的话,user1,user2,user3这三个用户在执行指定的命令的时候就不需要输入自己的密码了。
如果其中的命令有的需要输入密码,有的不需要输入密码的话,那就把PASSWD:写在那些命令的前面。或是把NOPASSWD:写在最后一个命令中;
user1 192.168.10.44=(root) NOPASSWD:/usr/sbin/useradd,PASSWD:/usr/sbin/usermod
例子:让用户user4使用passwd来管理用户的密码,但是不能给root用户设置密码:
user4 ALL=(root) /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
注意:如果最后不加上!/usr/bin/passwd root的话,那么会有很大的漏洞,user4可以修改root用户的密码;当添加上后,user4再次执行sudo passwd root的时候就会提示:
[user4@ns2 ~]$ sudo passwd root
[sudo] password for user4:
Sorry, user user4 is not allowed to execute '/usr/bin/passwd root' as root on ns2.xfzhou.com.
[user4@ns2 ~]$