在 Linux 中通过 Sudo 以另一个用户身份运行命令

想象一下这个场景。 您正在管理一个可供多个用户访问的 Linux 服务器。 所有用户都有 sudo 权利。 您想用不同的用户测试某些 Linux 命令。 你会怎么做? 以一个用户身份登录并测试命令,然后注销并以另一个用户身份重新登录并测试命令? 是的,这是一种方法。 但是,有一种简单的方法可以通过以下方式以另一个用户身份运行命令 sudo 在 Linux 中。 请仔细阅读,找出答案。

出于本指南的目的,我创建了两个用户帐户,即 “森提尔”“库马尔” 在我的 AlmaLinux 8 测试机上。 我将使用“senthil”作为当前用户,使用“kumar”作为目标用户。

我希望用户“senthil”能够在任何主机上以用户“kumar”的身份运行任何命令,而无需实际以“kumar”身份登录。 明白了吗? 好吧,让我给你看一个例子。

通过 Sudo 以其他用户身份运行命令

我目前以用户“senthil”的身份登录。 让我向您展示当前登录的用户 whoami 命令。

$ whoami senthil
在 Linux 中显示当前用户

现在我要运行一个简单的“echo” 命令与 sudo 以“senthil”身份登录时,作为目标用户“kumar”:

$ sudo -u kumar bash -c 'echo "My Username is $USER, and my user ID is $UID"'

系统将提示您输入当前用户的密码(本例中为“senthil”)。 一经认证, echo 命令将以用户“kumar”运行并显示“kumar”的用户名和用户 ID。

样本输出:

[sudo] password for senthil:  My Username is kumar, and my user ID is 1001

我们实际上只是执行了“echo” 命令以用户 “kumar” 身份登录,而我们以 “senthil” 身份登录。这就是为什么您看到 kumar 的用户名和用户 ID,但看不到 Senthil 的原因。

让我们验证用户“kumar”的 uid 是否正确 id 命令。

$ id kumar uid=1001(kumar) gid=1001(kumar) groups=1001(kumar),10(wheel)
通过 Sudo 以其他用户身份运行命令

是的,kumar 的 uid 在两个输出中都是正确的。

在这里, -u 标志用于以另一个用户身份运行给定的命令(即本例中的 kumar)和 bash -c 用于提及命令的名称。 您应该在单引号中提及该命令。

如果你不使用 bash -c 选项, echo 命令将返回当前用户的用户名和 uid,而不是目标用户。

$ sudo -u kumar echo "My Username is $USER, and my user ID is $UID"
My Username is senthil, and my user ID is 1000

同样,您可以以不同的用户身份运行任何命令。

请注意,在我们之前的示例命令中,我没有输入 sudo 目标用户的密码。 为什么? 因为, echo 命令不需要 sudo 密码。

如果您运行需要 sudo 作为其他用户的权限,您必须输入密码。 这是另一个例子。

$ sudo -u kumar bash -c 'sudo dnf --refresh update'

样本输出:

[sudo] password for senthil:  [sudo] password for kumar:  AlmaLinux 8 - BaseOS                                                                                                                                                               344  B/s | 4.3 kB     00:12     AlmaLinux 8 - AppStream                                                                                                                                                            388  B/s | 4.7 kB     00:12     AlmaLinux 8 - Extras                                                                                                                                                               316  B/s | 3.9 kB     00:12     Dependencies resolved. Nothing to do. Complete!
在 Linux 中以其他用户身份运行命令在 Linux 中以其他用户身份运行命令

你有没有注意到我进入了 sudo 两个用户的密码? 是的。 因为,我们运行“sudo dnf update“,这需要提升的权限。这就是为什么需要进入 sudo 目标用户的密码。 对于普通命令,例如 ls, uname 等等,我们不需要输入目标用户的密码。

不只是 Linux 命令,您也可以应用此方法来运行脚本。 假设您要运行保存在 $HOME 另一个用户的目录。 您可以使用以下命令从当前用户作为其他用户简单地运行脚本:

$ sudo -u kumar bash -c '~/backup_script_name'

运行没有 Sudo 密码的命令

有时,您可能会遇到不想进入 sudo 每个命令的密码。 在这种情况下,您可以通过添加来跳过特定命令的密码提示 NOPASSWD 选项在 /etc/sudoers 文件。

假设您要允许某个用户运行任何 dnf 命令没有 sudo 密码。 为此,首先要找到 dnf 命令使用 which 或者 whereis 命令。

$ which dnf /usr/bin/dnf
$ whereis dnf dnf: /usr/bin/dnf /etc/dnf /usr/share/man/man8/dnf.8.gz

如您所见, dnf 命令是 /usr/bin/dnf.

现在,编辑 /etc/sudoers 文件使用命令:

$ sudo visudo

小心: 请注意,您不应手动编辑 sudoers 文件使用任何文本编辑器。 始终使用 visudo 命令来安全地编辑 sudoers 文件。

在文件末尾添加以下行以允许名为“kumar”的用户运行 dnf 没有的命令 sudo 密码。

kumar ALL=NOPASSWD:/usr/bin/dnf

Save 文件并退出。

从现在开始,用户“kumar”可以运行 dnf 没有的命令 sudo 密码。

[[email protected] ~]$ sudo -u kumar bash -c 'sudo dnf --refresh update' [sudo] password for senthil:  AlmaLinux 8 - BaseOS                                                                                                                                                               358  B/s | 4.3 kB     00:12     AlmaLinux 8 - AppStream                                                                                                                                                            324  B/s | 4.7 kB     00:14     AlmaLinux 8 - Extras                                                                                                                                                               302  B/s | 3.9 kB     00:13     Dependencies resolved. Nothing to do. Complete!

看? 我们不需要输入 sudo “库马尔”的密码。

要撤销此行为,只需删除上述行。

免责声明: 应用此方法时应非常小心。 这种方法既可用于生产目的,也可用于破坏目的。 例如,如果您允许用户执行 'rm' 命令没有 sudo 密码,他们可能会意外或故意删除重要文件。 除非真的有必要,否则不要这样做。

结论

在这个简短的教程中,我们讨论了如何允许用户以另一个用户身份运行命令 sudo 在 Linux 中。 我们还学习了如何禁用 sudo 通过修改运行特定命令时某些用户的密码提示 sudoers 文件。

正如我警告的那样,在生产系统上测试此方法时必须小心。 您可能会在不知不觉中允许用户运行有害命令(例如 rm) 无需输入 sudo 密码。 在测试这些 Linux 技巧时,您应该始终小心。

相关阅读:

  • 通过 SSH 在远程 Linux 系统上执行命令
  • 如何在 Linux 中运行没有 Sudo 密码的特定命令

CLI 命令行LinuxLinux 管理Linux 基础Linux 命令Linux howtoLinux 提示sudosudo 用户