sudo 命令

另一方面,超级用户 do 或者 sudo 命令允许我们从当前用户以 root 身份运行命令。
默认情况下,这将要求我们再次提供密码作为安全措施。

非 root 用户帐户需要 sudo 权限才能执行此操作,这通常是通过将用户或者组添加到 /etc/sudoers 文件或者将用户添加到 wheel 组来设置的。

[jack@onitroad ~]# usermod -aG wheel user1
[jack@onitroad ~]# id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1),10(wheel)
[jack@onitroad ~]# su - user1
Last login: Tue Aug 30 11:42:46 AEST 2014 on pts/0
[jack@onitroad ~]$ sudo whoami
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
[sudo] password for user1:
root

在本示例中,root 用户将 user1 添加到 wheel 组,该组在 /etc/sudoers 配置文件中定义,以通过 sudo 命令提供 root 权限。
从那里我们使用 sudo 以 root 身份运行 whoami 命令,在提供 user1 的密码后,我们被告知我们是 root。
请注意,在此之后我们不会被放入 root shell。

sudo第一次输入用户密码后,后续的sudo使用不需要密码,如下图。
在这里我们还看到 user1 没有权限单独列出 /root 的内容,但是它可以与 sudo 一起正常工作。

[jack@onitroad ~]$ ls -l /root
ls: cannot open directory /root: Permission denied
[jack@onitroad ~]$ sudo ls -l /root
total 3244
-rw-------. 1 root root     984 Aug 29 14:21 anaconda-ks.cfg

我们还可以将 sudo 与 su 命令结合使用以进入交互式 root shell,而不是输入带有 sudo 前缀的每个命令。

[jack@onitroad ~]$ sudo su 
Last login: Tue Aug 30 11:49:01 AEST 2014 on pts/0
[jack@onitroad ~]# whoami
root

同样,我们可以获得带有 -i 标志的 shell。

[jack@onitroad ~]$ sudo -i
[sudo] password for user1:
[jack@onitroad ~]# whoami
root

为了定义可能以root权限执行的特定命令,我们修改/etc/sudoers文件。
例如,我们可以将以下配置添加到 /etc/sudoers 文件中,这将允许 user1 执行 systemctl 命令,允许他们使用 sudo 停止和启动服务(除其他外,systemctl 在 RHEL 7 中可以做很多事情)。

user1   ALL=(ALL) /bin/systemctl

这将是他们可以用 sudo 做的所有事情,任何其他尝试都将被拒绝。

[jack@onitroad ~]$ sudo systemctl restart httpd
[jack@onitroad ~]$ sudo ls /root
Sorry, user user1 is not allowed to execute '/bin/ls /root' as root on centos7.example.com.
[jack@onitroad ~]$ exit
logout
[jack@onitroad ~]# su - user2
Last login: Tue Aug 30 12:42:20 AEST 2014 on pts/0
[jack@onitroad ~]$ sudo systemctl restart httpd
user2 is not in the sudoers file.  This incident will be reported.

正如预期的那样,user1 可以重新启动 Apache,但不允许 user2.
我们还看到 user1 无法执行其他需要 root 的任务,例如列出 /root 目录的内容。

Linux 中 su 和 sudo 命令的区别

su 命令

su 命令允许我们切换用户并以其他用户的身份在其用户 ID 下运行命令。

当你不带任何参数运行 su 时,它会默认尝试打开一个 root shell,因此会提示你输入 root 密码以继续。
输入 root 密码后,我们现在是 root 用户,我们在此会话期间运行的任何内容都将以 root 身份运行。

[jack@onitroad ~]$ whoami
user1
[jack@onitroad ~]$ su
Password:
[jack@onitroad user1]# whoami
root

或者,我们可以指定要更改为的用户,除非我们是 root,否则通常需要他们的密码。

[jack@onitroad ~]# su - user1
Last login: Tue Aug 30 11:30:32 AEST 2014 on pts/0
[jack@onitroad ~]$ whoami
user1
[jack@onitroad ~]$ su - user2
Password:
Last login: Tue Aug 30 11:29:59 AEST 2014 on pts/0

如图所示,如果 user1 想要切换到 user2,他们需要密码,但是 root 可以切换到任何其他用户而无需提供密码。

虽然不需要指定“-”,但建议用于交互式 shell。
如下图如果不指定'-'切换用户,/root的路径或者当前工作目录不会改变,这可能会导致user1去运行命令时出现问题。

[jack@onitroad ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[jack@onitroad ~]# su user1
[jack@onitroad root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[jack@onitroad root]$ exit
exit
[jack@onitroad ~]# su - user1
Last login: Tue Aug 30 11:32:02 AEST 2014 on pts/0
[jack@onitroad ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin

本质上,我们几乎总是想在使用 su 时使用“-”。

我们不仅需要输入新用户的 shell,我们还可以选择使用 -c 标志以该用户身份执行命令。

[jack@onitroad ~]$ su -c whoami
Password:
root

现在我们了解了 su 命令,让我们看看 sudo 提供了什么。

su 和 sudo 的区别

通过对每个命令的解释,希望我们已经可以看到两者之间的主要区别。

它们在某些方面确实非常相似,“su”命令基本上等同于“sudo -i”,而“sudo”命令基本上等同于“su -c”。

一个主要的关键区别在于谁获得了 root 密码。
如果用户希望 su 成为 root,那么他们需要 root 帐户的密码。
相反,如果用户使用 sudo 执行命令,则他们只需要自己的密码和 sudo 权限。
因此,如果我们有多个用户在系统上需要 root 权限,则提供 sudo 访问被认为更安全,因为我们可以审核特定用户执行的命令,而无需与其他人共享 root 用户的密码。

默认情况下,非 root 用户可以使用 sudo 权限来更改 root 密码,但是 /etc/sudoers 文件可用于仅授予 root 访问用户需要以 root 身份运行的特定命令的权限,而不是能够以 root 身份运行任何命令根。
使用 sudo 我们可以定义安全策略,允许一组用户以 root 用户身份仅执行明确定义的命令的特定子集。

日期:2020-07-07 20:56:56 来源:oir作者:oir