Linux中sudo和su之间的区别

在对两个不同的命令sudosu进行总结之前,先对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加载的仍旧是之前登陆的用户的环境变量和各种设置。

举个例子

普通用户 lamp 通过 su 命令切换成 root 用户,但没有使用 - 选项,这样情况下,虽然看似是 root 用户,但系统中的 $PATH 环境变量依然是 lamp 的(而不是 root 的),因此当前工作环境中,并不包含 /sbin、/usr/sbin等超级用户命令的保存路径,这就导致很多管理员命令根本无法使用。不仅如此,当 root 用户接受邮件时,会发现收到的是 lamp 用户的邮件,因为环境变量 $MAIL 也没有切换。

二、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 了。

你可能感兴趣的:(Shell,linux,golang,linux,开发语言)