想象一下这个场景。 您正在管理一个可供多个用户访问的 Linux 服务器。 所有用户都有 sudo
权利。 您想用不同的用户测试某些 Linux 命令。 你会怎么做? 以一个用户身份登录并测试命令,然后注销并以另一个用户身份重新登录并测试命令? 是的,这是一种方法。 但是,有一种简单的方法可以通过以下方式以另一个用户身份运行命令 sudo 在 Linux 中。 请仔细阅读,找出答案。
出于本指南的目的,我创建了两个用户帐户,即 “森提尔” 和 “库马尔” 在我的 AlmaLinux 8 测试机上。 我将使用“senthil”作为当前用户,使用“kumar”作为目标用户。
我希望用户“senthil”能够在任何主机上以用户“kumar”的身份运行任何命令,而无需实际以“kumar”身份登录。 明白了吗? 好吧,让我给你看一个 example.
通过 Sudo 以其他用户身份运行命令
我目前以用户“senthil”的身份登录。 让我向您展示当前登录的用户 whoami
命令。
$ whoami senthil
现在我要运行一个简单的“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)
是的,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
同样,您可以以不同的用户身份运行任何命令。
请注意,在我们之前的 example 命令,我没有输入 sudo
目标用户的密码。 为什么? 因为, echo
命令不需要 sudo
密码。
如果您运行需要 sudo
作为其他用户的权限,您必须输入密码。 这是另一个 example.
$ 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!

你有没有注意到我进入了 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
“库马尔”的密码。
要撤销此行为,只需删除上述行。
免责声明: 应用此方法时应非常小心。 这种方法既可用于生产目的,也可用于破坏目的。 说为 example如果你允许用户执行 'rm'
命令没有 sudo
密码,他们可能会意外或故意删除重要文件。 除非真的有必要,否则不要这样做。
结论
在这个简短的教程中,我们讨论了如何允许用户通过以下方式以另一个用户身份运行命令 sudo 在 Linux 中。 我们还学习了如何禁用 sudo 通过修改运行特定命令时某些用户的密码提示 sudoers
文件。
正如我警告的那样,在生产系统上测试此方法时必须小心。 您可能会在不知不觉中允许用户运行有害命令(例如 rm
) 无需输入 sudo 密码。 在测试这些 Linux 技巧时,您应该始终小心。
相关阅读:
- 通过 SSH 在远程 Linux 系统上执行命令
- 如何在 Linux 中运行没有 Sudo 密码的特定命令