https://www.cnblogs.com/f-ck-need-u/p/7011669.html
系统用户、组管理su和sudo
su
切换或以指定用户运行命令。
使用su可以指定运行命令的身份(user/group/uid/gid)
为了向后兼容,su默认不会改变当着目录,且仅设置HOMW和SHELL这两个环境变量(若目标用户非root,则还设置USER和LOGNAME环境变量)。推荐使用–login选项(即-选项)避免环境变量混乱。
1 | su [options...] [-] [user [args...]] |
注意:
(1). 若su没有给定任何参数,将默认以root身份运行交互式的shell(交互式,所以需要输入密码),即切换到root用户,但只改变HOME和SHELL环境变量。
(2). su - username是交互式登录,要求密码,会重置整个环境变量,它实际上是在模拟真实的登录环境。
(3). su username是非交互登录,不会重置除HOME/SHELL外的环境变量。
例如:用户wangwu家目录为/home/wangwu,其shell为/bin/csh。
1 | shell> head -1 /etc/passwd ; tail -1 /etc/passwd |
首先su到wangwu上,再执行一个完全不带参数的su。
1 | shell> su - wangwu # 使用su - username后,以登录shell的方式模拟登录,会重新设置各环境变量。su - username是交互式登录 |
1 | shell> su # 不带任何参数的su,是交互式登录切换回root,但只会改变HOME和SHELL环境变量 |
1 | shell> su - # su - 的方式切换回root |
在某些环境下或脚本中,可能需要临时切换身份执行命令,注意这时候的环境变量是否会改变,否则很可能报错提示命令找不到。
sudo
sudo可以让一个用户以某个身份(如root或其他用户)执行某些命令,它隐含的执行方式是切换到指定用户再执行命令,因为涉及到了用户的切换,所以环境变量是否重置是需要设置的。
sudo支持插件实现安全策略。默认的安全策略插件是sudoers,它是通过/etc/sudoers或LDAP来配置的。
安全策略是控制用户使用sudo命令时具有什么权限,但要注意,安全策略可能需要用户进行身份认证,如密码认证的机制或其他认证机制,如果开启了认证要求,则在指定时间内未完成认证时sudo会退出,默认超时时间为5分钟。
安全策略支持对认证进行缓存,使得在一定时间内该用户无需再次认证就可以执行sudo命令,默认缓存时间为5分钟,sudo -v可以更新认证缓存。
sudo支持日志审核,可以记录下成功或失败的sudo。
/etc/sudoers文件
该文件里主要配置sudo命令时指定的用户和对应的权限。
1 | shell> visudo # 以下选取的是部分行 |
用户名 主机名=(可切换到的用户身份) 权限和命令
① ② ③ ④
1 | ①用户名:可以用组,只需在组名前加个百分号%表示。 |
NOPASSWD:/usr/sbin/useradd,PASSWD:/usr/sbin/userdel
1 | 它表示useradd命令不需要输入密码,而userdel需要输入密码。 |
FILESERVERS = fs1, fs2
1 |
|
其中上面的”/usr/bin/passwd [!-]*”表示允许修改加参数的密码。”/bin/su - [!-]*”表示允许”su -“到某用户下,但必须给参数。
sudo和sudoedit命令
当sudo执行指定的command时,它会调用fork函数,并设置命令的执行环境(如某些环境变量),然后在子进程中执行command,sudo的主进程等待命令执行完毕,然后传递命令的退出状态码给安全策略并退出。
1 | sudoedit等价于sudo -e,它是以sudo的方式执行文件编辑动作。 |
在sudo上可以直接设置环境变量,它会传递为command的环境。设置的方式为var=value,如LD_LIBRARY_PATH=/usr/local/pkg/lib
由于sudo默认的安全策略插件是sudoers,所以当用户执行sudo时,系统会自动去寻找/etc/sudoers文件(该文件里被root配置了用户对应的权限,也即安全策略),查看sudo要使用的用户是否有对应的权限,如果有则执行,如果没有权限就失败退出sudo。