在对两个不同的命令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命令
su命令的意思是switch user,即切换用户的意思。su命令的用法有以下两种:
su - 用户
或者
su
在使用su时增加符号 - 代表login-shell的方式,即切换到另外一个用户,但当前的shell会加载当前用户的环境变量和各种设置。
使用su命令时,不使用符号 - 代表non-login-shell,意思为当前的shell切换到了另外一个用户,当前的shell会加载之前登陆的用户的环境变量和各种设置。
二、sudo命令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 了。



