主要内容
su命令
一般来说,在使用unix-like操作系统的时候,我们都不会以管理员身份直接登录系统,以避免一些误操作对系统造成的影响,例如误删除一些系统配置文件。但是,为了方便系统的管理,我们又需要临时切换到管理员账号进行一些系统设置,这个时候,就可以使用su命令,它的作用就是在终端里切换不同账号的,su命令全称(switch user)。
su命令的基本使用
假如当前登录的用户是jack,他要切换到root用户管理系统,就可以使用下面的命令
1 2 3 4 |
[jack@study ~]$ su root #切换到root用户 Password: #这里输入root用户的密码 #只要验证成功,就可以作为root登录,从而行使root的权限 [root@study jack]# |
我们都知道,每一个shell都有自己的环境变量,不同用户shell中的环境变量通常是不一样的。jack通过su root命令虽然把用户切换成root,但是,切换后shell中的环境变量依然是jack自己的:
1 2 3 4 5 6 7 8 |
[root@study jack]# env #查看当前环境变量 XDG_VTNR=1 XDG_SESSION_ID=4 HOSTNAME=study.centos.konrida TERM=xterm-256color SHELL=/bin/bash HISTSIZE=1000 USER=jack #用户依然是jack |
如果希望切换用户的时候连同环境变量一起改变,可以使用下面的命令
1 2 3 4 5 6 7 8 9 10 11 |
[jack@study ~]$ su - root Password: Last login: Sat Jan 6 11:34:59 CST 2018 on pts/0 [root@study ~]# env XDG_VTNR=1 XDG_SESSION_ID=4 HOSTNAME=study.centos.konrida SHELL=/bin/bash TERM=xterm-256color HISTSIZE=1000 USER=root |
注意su和root之间添加了一个(-)横杠,切换后再使用env观看环境变量,这一次,用户和变量都更改了。
su命令的一个问题
su命令在切换用户的时候,必须拥有目标用户的密码,也就是说,如果要切换root账号,你就必须拿到root账号的密码,如果root密码人人皆知,那是十分不安全的。如果不想把root密码泄露出去,而又希望用户可以执行root的权限,那么可以使用sudo命令。
sudo命令
sudo命令和前面的su命令主要有两点不同:
- sudo命令只执行命令,而不切换用户
- sudo命令以运行者的密码验证身份,而不使用目标用户的密码
举个例子,一般更新系统的命令只有管理员可以执行,但是合法的用户也可以通过sudo执行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[normal@study ~]$ sudo yum update #通过sudo执行yum更新系统 [sudo] password for normal: #这里输入密码,不过输入的是normal用户自己的密码 Loaded plugins: fastestmirror, langpacks Repository base is listed more than once in the configuration Repository updates is listed more than once in the configuration Repository extras is listed more than once in the configuration Repository centosplus is listed more than once in the configuration Loading mirror speeds from cached hostfile * base: mirrors.cn99.com * epel: mirror.ehost.vn * extras: mirrors.shuosc.org * updates: mirrors.shuosc.org No packages marked for update [normal@study ~]$ |
第一点,直到命令执行完毕,当前用户依然是normal,没有进行账号切换
第二点,第二行输入密码的时候,注意观察是passwd for normal(normal的密码),即只需要输入一般用户的密码即可执行需要root权限的命令。
用户使用自己的密码进行验证来执行root权限,这不是更危险吗?是的,的确是很危险,因此上面也说了只有合法的用户才可以使用sudo。
sudoers配置文件
那么,什么用户才算是合法的用户呢?其实,当管理员认为某个用户是可信任的,且需要放权到这个用户的时候,就会把该用户添加进受信任列表,这个受信任列表就是/etc/sudoers配置文件。该文件指定了哪些用户能以什么身份执行哪些命令,也就是说,能使用sudo命令的用户必须存在于sudoers配置文件中。
sudoers文件语法
sudoers语法可以很复杂,但我们只说说常见的配置方式:
- root ALL=(ALL) ALL
- %wheel ALL=(ALL) ALL
其中第一行是设置针对用户设置,而第二行是针对组设置的。它们的含义是:
- root用户可以从任意主机登录,并使用任意身份运行任何命令
- wheel组中的任意用户可以从任意主机登录,并使用任意身份运行任何命令
所以,从左到右,一共4列,每一列表示的意思是
- 用户名/组名(可以指定多个用户)
- 可以从什么远程主机登录(可以指定多个主机)
- 以什么身份登录(可以指定多个用户)
- 用户可以运行的命令(可以指定多个命令)
举个例子,当前主机中有root、jack、kate、normal一共4个用户账号,管理员允许jack和kate以root身份运行系统更新命令,sudoers文件中就要添加以下设置:
1 |
jack,kate ALL=(root) /usr/bin/yum update |
如果没有把相关用户添加进文件,当用户尝试使用sudo命令的时候就会出现错误:
1 2 3 |
[jack@study normal]$ sudo yum update [sudo] password for jack: jack is not in the sudoers file. This incident will be reported. |
使用别名简化设置
针对上面提到的4列,都对应一个别名指令,它们分别是
- User_Alias
- Host_Alias
- Runas_Alias
- Cmnd_Alias
使用这些命令的话,前面的例子可以改写为:
1 2 3 4 5 6 |
User_Alias UPDATE_USER = jack,kate Host_Alias ALLOW_HOST = ALL Runas_Alias THE_ROOT = root Cmnd_Alias UPDATE_COMMAND = /usr/bin/yum update UPDATE_USER ALLOW_HOST = (THE_ROOT) UPDATE_COMMAND |
这不是更复杂了吗,前面只用了一行,但是这里一共是5行,不是说简化吗?是的,当用户不是特别多的时候,还是不建议使用别名;别名的好处是当相同配置需要设置多次的情况下使用的。
禁止使用特定命令
sudoers文件除了可以授予用户使用某个命令的权限,也可以禁止用户使用特定的命令。假如授予了jack使用/usr/bin/passwd权限,允许他帮助其他用户修改密码,可能会出现问题。
1 2 3 4 |
[jack@study normal]$ sudo passwd kate [sudo] password for jack: Changing password for user kate. New password: |
sudo passwd 命令后面指定其他用户的时候,是没有问题的,但是如果jack直接输入sudo passwd,结果会怎样?
1 2 3 |
[jack@study normal]$ sudo passwd Changing password for user root. New password: |
管理员的原意是允许jack帮助其他用户修改密码,但又必须禁止jack修改root的密码。那就必须对sudoers文件作进一步的设置
1 |
Cmnd_Alias UPDATE_COMMAND = /usr/bin/yum update, !/usr/bin/passwd, /usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root |
以感叹号开头的命令都是被禁用的命令。修改完之后,jack就可以修改其他用户的密码,但无法修改root的密码。
不用密码切换到root
配合sudo和su命令,可以使用户不需要root密码直接切换到root用户
1 |
jack ALL=(root) /bin/su - |
用户只需要输入命令sudo su – 就可以直接切换到root用户。
转载请注明:Pure nonsense » su和sudo命令