背景
在实际工作当中需要在Linux不同用户之间进行切换。root用户权限最高,很多时候需要root用户才能执行一些关键命令或者访问一些关键资源,所以需要临时切换为root用户。工作完成后,考虑到系统的安全性避免误操作需要切换为普通用户。
su和sudo就是为了解决该问题内置的Linux命令。
su
switch user,切换用户
命令 | 描述 | 备注 |
---|---|---|
su su -m | 切换到username用户下 输入该命令后,需要输入username用户的密码,才能切换到username username用户名可以省略,默认是切换到root用户 non-login shell方式,即环境变量还是原用户的 | |
su - su -l | 切换到username用户下 输入该命令后,需要输入username用户的密码,才能切换到username username用户名可以省略,默认是切换到root用户 login shell方式,先以目标用户登录,再执行命令,是真正切换到了username用户下,环境变量也切换到了username用户 | |
su -c “命令” | -c参数表示以目标用户执行完后面命令之后又切换为原来本身用户 |
说明:su从普通用户切换到其他用户需要输入密码,但是从root用户切换到普通用户就不需要密码,root拥有最高权限;
缺点:su命令是需要知道切换目标用户的密码的。最常使用的场景就是切换到root用户,因为root用户拥有系统的最高权限,很容易误操作造成系统挂掉。一般情况下root密码尽可能要进行保密。
sudo
与su不同的是,sudo可以跳过切换目标用户登录而去执行一些特定命令,而且sudo仅需要自己的密码,而不需要切换目标用户的密码,而且sudo在输入一次密码后,在一段时间内都不需要再输密码了(系统配置)。
命令 | 描述 | 备注 |
---|---|---|
sudo 命令 | 默认以root用户权限执行命令 需要输入自身的密码 | |
sudo -u 命令 sudo - 命令 | 以user用户权限执行命令 需要输入自身的密码 |
可以发现如果不加控制,任何用户只要输入自己密码都能使用sudo命令以root用户的权限操作系统,这是很危险的,因此要对用户使用sudo命令做控制,在系统/etc/sudoers配置文件中就配置了用户使用sudo的权限:
developmac@DevelopdeMBP /tmp % sudo cat /etc/sudoers
developmac is not in the sudoers file. This incident will be reported.
developmac@DevelopdeMBP /tmp % su - root
Password:
DevelopdeMBP:~ root# cat /etc/sudoers
......
root ALL = (ALL) ALL
#%admin ALL = (ALL) ALL
......
可以看到/etc/sudoers
文件中只对root用户授予了使用sudo的权限,因此developmac
用户使用sudo命令时报告错误,对developmac
用户授予sudo权限后就可以使用sudo命令了
developmac@DevelopdeMBP /tmp % sudo cat /etc/sudoers
Password:
......
root ALL = (ALL) ALL
#%admin ALL = (ALL) ALL
developmac ALL = (ALL) ALL
......
可以看到/etc/sudoers
具体配置:
root ALL = (ALL) ALL
#%admin ALL = (ALL) ALL
developmac ALL = (ALL) ALL
- 第2行
#
开头是注释 - 授权语法为:第一列root不用多说,是用户账号/授权用户,第二列的ALL意思是登陆者的来源主机名,第三列等号右边小括号里的ALL是代表能够切换的身份。第四列ALL是可运行的命令
- 如果要对很多用户授权,对每个用户都加配置会很麻烦,
/etc/sudoers
也支持对组授权,如第2行%
开头的就是授权组,%admin
表示授权给admin组
几个授权示例:
#授权给wheel组的用户,使它们能以root身份执行passwd命令
%wheel ALL=(root) /usr/bin/passwd
#授权给developmac用户,使它能以root身份执行passwd命令,但是不能修改root用户的密码,!表示禁止
developmac ALL=(root) !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
#授权给developmac用户,使它能以root身份执行ls和passwd命令,NOPASSWD表示使用者不需要输入自己的密码就可以执行ls命令
developmac ALL=(root) NOPASSWD:/bin/ls,/usr/bin/passwd
/etc/sudoers
配置还支持别名:
User_Alias:授权用户列表
Host_Alias:授权主机列表
Runas_Alias:授权登录用户列表
Cmnd_Alias:授权命令列表
如:
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Runas_Alias OP = root, operator
User_Alias FULLTIMERS = millert, mikef, dowdy
Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less
FULLTIMERS CSNETS=(OP) PAGERS
FULLTIMERS CSNETS=(root) PAGERS
sudo搭配su一起使用,修改配置文件/etc/sudoers
User_Alias ADMINS = user1, user2, user3
ADMINS ALL=(root) /bin/su -
这样用户user1,user2,user3就直接切换到root了。
关于修改/etc/sudoers
配置文件:
可以通过vi/vim命令修改文件,最好的做法是通过visudo来修改。这个命令可以编辑保存的同时检查语法的正确性。这样可以避免由于误操作造成文件无法使用sudo命令。
总结
su方式切换是须要输入目标用户的password。而sudo仅仅须要输入自己的password,所以sudo能够保护目标用户的password不外流的。当帮root管理系统的时候,su是直接将root全部权利交给用户。而sudo能够更好分工,仅仅要配置好/etc/sudoers,这样sudo能够保护系统更安全,并且分工明白,有条不紊。
参考:
Linux中su和sudo的用法整理
linux权限之su和sudo的差别
Linux下su与su -命令的本质区别