Linux系统命令及Shell脚本实践指南
上QQ阅读APP看书,第一时间看更新

2.3 切换用户

在使用Linux的过程中,很多时候由于实际需要可能要在不同的用户之间切换,比如,原本是使用普通用户登录的,但是在操作的过程中由于权限原因必须使用root用户来做一些操作,这时就需要临时切换成root用户;操作完成后,再退出切换成普通用户。其中将会涉及两种切换用户的方法:su和sudo,本节将针对这两种方法进行详细讲解。

2.3.1 切换成其他用户

在本章开头时就提到,Linux用户分为根用户(root)、普通用户、系统用户3种。其中根用户和普通用户是可以实际登录到系统中的。假如说我以普通用户john登录到系统中,这时候想使用useradd添加一个用户,怎么办?普通用户是没有添加用户的权限的,只有root用户才能创建用户。当然我们可以使用exit命令退出当前用户,然后使用root用户登录,再使用useradd添加用户。但是也有一种更方便的方式,那就是使用su命令,su是切换用户的意思。在不加参数的情况下,su命令默认表示切换到root用户,之后只要输入root密码就可以切换身份为root了,完成操作后,使用exit命令可以退出root切换到原先的用户。如下所示:

[john@localhost ~]$ su
Password: #输入root用户的密码
[root@localhost john]# pwd
/home/john
[root@localhost john]# exit
exit
[john@localhost ~]$

su命令后面还可以加上一个“-”参数,就是键盘上的中横线。加上这个参数后,切换成root用户时,不但身份变成了root,而且还能应用root的用户环境。所谓“用户环境”就是/etc/passwd中定义的用户家目录、使用的Shell,以及关于这个用户的个性化设置等。如下所示:

[john@localhost ~]$ su-
Password:  #输入root用户的密码
[root@localhost ~]# pwd
/root
[root@localhost ~]# exit
logout
[john@localhost ~]$

在演示su和su-这两个命令的时候,我在中间故意都运行了pwd命令,可以看到两次命令的显示是不一样的。真正的原因是使用su命令切换用户之后,当前的用户环境并没有发生变化,而使用su-命令切换用户后,用户环境变成root的了。

su-命令后还可以继续跟其他的用户名作为参数,这样就可以切换成指定用户的身份。比如说用户john在使用过程中需要临时切换成用户user1,这时就可以使用su- user1命令切换用户,但是同样需要知道user1的密码。值得一提的是,root用户可以使用su命令切换成任意用户而不需要密码,如下所示:

[john@localhost ~]$ su- user1
Password:  #输入用户user1的密码
[user1@localhost ~]$

使用su命令虽然很方便,但还是有很明显的缺陷,就是切换成其他用户的前提是需要知道对方的密码。如果需要切换成root,那就需要root的密码。我们知道,root是系统中权限最高的用户,如果让太多人知道root密码,必然是很不安全的。为解决这个问题,我们可以使用sudo命令。

2.3.2 用其他用户的身份执行命令:sudo

上一节中了解了su命令,并且也知道了这个命令存在的缺陷。而sudo则通过一种可配置的方式解决了这个问题。该命令的使用方式是在sudo后跟上需要执行的命令,比如说sudo passwd user1,即使用root的身份修改user1的密码。运行该命令时,系统首先检查/etc/sudoers,判断该用户是否有执行sudo的权限,在确定有执行权限后,系统要求用户输自己的密码,如果密码输入正确,则会以root用户的身份运行passwd user1命令。

在演示sudo命令之前,首先需要设置/etc/sudoers这个配置文件。当然,可以使用一些常见的编辑器来编辑这个文件,比如vi或者vim编辑器等(常见编辑器的使用方法将在第9章中讲解),但是考虑到这个配置文件的重要性,Linux提供了专门编辑这个文件的方式,就是使用命令visudo来编辑这个文件,它的好处是可以在编辑后保存退出时自动检查语法设置,以防止不小心配置错误而造成无法使用sudo命令。该命令如下所示:

[root@localhost ~]# visudo
## Sudoers allows particular users to run various commands as
## the root user,without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands,which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the 'visudo' command.
......(略去内容)......
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
john    ALL=(ALL)       ALL  #复制上一行的内容,并修改用户名为john
## Allows members of the 'sys' group to run networking,software,
## service management apps and more.
# %sys ALL = NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES,LOCATE,DRIVERS
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users  ALL=/sbin/mount /mnt/cdrom,/sbin/umount /mnt/cdrom
## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown-h now

修改完成后,使用用户john登录,然后再尝试使用sudo给别的用户修改密码,系统首先要求输入用户john的密码,验证通过后,就可以设置其他用户的密码了,如下所示:

[john@localhost ~]$ sudo passwd user1
[sudo] password for john:  #这里输入用户john的密码
Changing password for user user1.
New UNIX password:  #输入user1的新密码
Retype new UNIX password:  #再次输入user1的新密码
passwd: all authentication tokens updated successfully.

加入的“john ALL=(ALL) ALL”这一行代表的意思是,john这个用户(第一列)可以从任何地方登录后(第二列的ALL)执行任何人(第三列的ALL)的任何命令(第四列的ALL)。还可以定义某一个组的sudo权限,比如“%john ALL=(ALL) ALL”可以让所有属于john用户组的用户从任何地方登录后执行任何人的任何命令。

正如上面例子所演示的,只需要知道自己的密码就可以使用sudo执行任何命令,这样方便多了。但是每次都需要输入一遍密码也是比较麻烦的事情,想要实现不需要输入密码就可以执行命令,可以在最后一个ALL前添加“NOPASSWD:”,如下所示:

john    ALL=(ALL)       NOPASSWD:ALL

这样用户john在使用sudo时就不再需要输入密码了。实际上,将最后一个参数设置为ALL是很不安全的,因为这意味着用户实际拥有了全部的系统权限,和root的权限是一致的,在工作中可以根据用户实际的工作内容定义用户可以sudo执行的命令列表。假设用户john由于工作需要,经常要重启或者关闭服务器,那么就可以进行如下设置:

john    ALL=(ALL)       NOPASSWD:/sbin/shutdown,/usr/bin/reboot

严格来说,sudo并不是真的切换了用户,而是使用其他用户的身份和权限执行了命令。