在对两个不同的命令sudo
和su
进行总结之前,先对Linux
环境下是如何增加管理用户的来进行讲解,因为新手在进行测试直接需要建立一个普通的用户来进行测试和管理,这也是众多在Linux
环境下开发的工作者的一个需求,准备的工作如下:
建立新用户的命令为useradd
常用的配置选项如下:
zhaokaiyue@zhaokaiyue-PC:~$ useradd
用法:useradd [选项] 登录
useradd -D
useradd -D [选项]
选项:
-b, --base-dir BASE_DIR 新账户的主目录的基目录
-c, --comment COMMENT 新账户的 GECOS 字段
-d, --home-dir HOME_DIR 新账户的主目录
-D, --defaults 显示或更改默认的 useradd 配置
-e, --expiredate EXPIRE_DATE 新账户的过期日期
-f, --inactive INACTIVE 新账户的密码不活动期
-g, --gid GROUP 新账户主组的名称或 ID
-G, --groups GROUPS 新账户的附加组列表
-h, --help 显示此帮助信息并推出
-k, --skel SKEL_DIR 使用此目录作为骨架目录
-K, --key KEY=VALUE 不使用 /etc/login.defs 中的默认值
-l, --no-log-init 不要将此用户添加到最近登录和登录失败数据库
-m, --create-home 创建用户的主目录
-M, --no-create-home 不创建用户的主目录
-N, --no-user-group 不创建同名的组
-o, --non-unique 允许使用重复的 UID 创建用户
-p, --password PASSWORD 加密后的新账户密码
-r, --system 创建一个系统账户
-R, --root CHROOT_DIR chroot 到的目录
-s, --shell SHELL 新账户的登录 shell
-u, --uid UID 新账户的用户 ID
-U, --user-group 创建与用户同名的组
-Z, --selinux-user SEUSER 为 SELinux 用户映射使用指定 SEUSER
需要注意的是,在新建用户时,如果需要建立家目录,需使用-m参数指定建立目录的路径。
建立完新的用户后为用户建立密码则需用到passwd
命令,命令的用法如下:
passwd 用户名
su命令的意思是switch user
,即切换用户的意思。su命令的用法有以下两种:
su - 用户
或者
su
在使用su时增加符号 -
代表login-shell
的方式,即切换到另外一个用户,当前的shell
会加载为另外一个用户的环境变量和各种设置。
使用su命令时,不使用符号 -
代表non-login-shell
,意思为当前的shell切换到了另外一个用户,当前的shell
加载的仍旧是之前登陆的用户的环境变量和各种设置。
举个例子
普通用户 lamp
通过 su
命令切换成 root
用户,但没有使用 -
选项,这样情况下,虽然看似是 root 用户,但系统中的 $PATH 环境变量依然是 lamp 的(而不是 root 的),因此当前工作环境中,并不包含 /sbin、/usr/sbin等超级用户命令的保存路径,这就导致很多管理员命令根本无法使用。不仅如此,当 root 用户接受邮件时,会发现收到的是 lamp 用户的邮件,因为环境变量 $MAIL 也没有切换。
sudo命令的意思是超级用户
使用命令前增加sudo
可以不用切换 用户而执行当前的命令,除了这个作用还有的作用有:
1、切换到root
用户
sudo su -
这种方式是以为login-shell
的方式切换到的root
用户,但和su -
切换的方式有区别:
sudo su - 需要提供的是当前用户的登陆密码
su - 需要提供的是root用户的登陆密码
sudo -i
的命令和sudo su -
实现的方式相同,需要当前用户的密码。
2、sudo的工作原理
在使用sudo
进行用户切换的时候,有时候会出现以下错误信息:
test_user is not in the sudoers file. This incident will be reported.
这是因为一个用户能否使用sudo
命令,是由/etc/sudoers
决定的,该文件是一个文本文件。可以使用该文件在其中增加命令,使该用户具有权限。
/etc/sudoers 也是一个文本文件,但是因其有特定的语法,我们不要直接用 vim 或者 vi 来编辑它,需要用 visudo
这个命令。输入这个命令之后就能直接编辑 /etc/sudoers 这个文件了。
需要说明的是,只有root
用户才有权限使用visudo
命令。
直接在root
用户下的命令行中输入visudo
命令:
root@VM-0-14-ubuntu:~# visudo
输出:
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
ubuntu ALL=(ALL:ALL) NOPASSWD: ALL
解释下每一行的格式:
1、第一个表示用户名,如 root 、ubuntu 等;
2、接下来等号左边的 ALL 表示允许从任何主机登录当前的用户账户;
3、等号右边的 ALL 表示:这一行行首对一个的用户可以切换到系统中任何一个其它用户;
4、行尾的 ALL 表示:当前行首的用户,能以 root 用户的身份下达什么命令,ALL 表示可以下达任何命令。
我们还注意到 ubuntu
对应的那一行有个 NOPASSWD
关键字,这就是表明 ubuntu
这个用户在请求 sudo
时不需要输入密码,到这里就解释了前面的问题。
同时我们注意到,这个文件里并没有 test_user
对应的行,这也就解释了为什么 test_user
无法使用 sudo
命令。
接下来,我们尝试将 test_user
添加到 /etc/sudoers
文件中,使 test_user
也能使用 sudo
命令。我们在最后一行添加:
test_user ALL=(ALL:ALL) ALL # test_user 使用 sudo 需要提供 test_user 的密码
接下来我们再在 test_user
账户下执行 sudo
:
ubuntu@VM-0-14-ubuntu:~$ su - test_user
Password:
$ tail -n 3 /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
$ sudo tail -n 3 /etc/shadow # 加上 sudo
ntp:*:17752:0:99999:7:::
mysql:!:18376:0:99999:7:::
test_user:$6$.ZY1lj4m$ii0x9CG8h.JHlh6zKbfBXRuolJmIDBHAd5eqhvW7lbUQXTRS//89jcuTzRilKqRkP8YbYW4VPxmTVHWRLYNGS/:18406:0:99999:7:::
$
可以看到,现在已经可以使用 sudo
了。