我想以 root 权限运行某些程序,但不让用户成为管理员/授予他们 sudo 权限(实际上使他们成为管理员)。因此我想测试:su adminuser echo "Hello World"
这只导致我收到错误消息:bash: echo: Permission denied
答案1
该su
命令通常用于运行交互的shell(默认情况下,是目标用户的密码数据库条目中列出的 shell)。如果要使用它以非交互方式运行命令,则应将命令字符串作为参数传递给选项-c
,如下所示man su
:
-c, --command=command Pass command to the shell with the -c option.
所以
su adminuser -c 'echo "Hello World"'
或者
su -c 'echo "Hello World"' adminuser
注意:以下内容在 Ubuntu 22.04 上使用该su
命令的 util-linux 实现进行了测试。如果您使用不同的实现(例如来自软件包的实现),行为可能会略有不同shadow
- 虽然我不知道当前支持的 Ubuntu 版本默认使用该实现。
当你运行 时su adminuser echo "Hello World"
,echo
和Hello World
会被传递给用户的 shell,如下所示参数。大多数 shell 会将其echo
视为要从中读取命令的文件的名称,并将任何剩余的参数视为位置参数。例如:
$ sudo chsh -s /bin/sh testuser
$ su testuser echo "Hello World"
Password:
sh: 0: cannot open echo: No such file
但是 bash(至少是 bash 5.1.16)似乎尝试echo
使用用户来解析PATH
,然后失败,因为结果是一个二进制可执行文件:
$ sudo chsh -s /bin/bash testuser
$ su testuser echo "Hello World"
Password:
/usr/bin/echo: /usr/bin/echo: cannot execute binary file
我可以重现的唯一情况bash: echo: Permission denied
是如果存在一个名为的无法读取的本地文件echo
:
$ touch echo && chmod -r echo
$ su testuser echo "Hello World"
Password:
bash: echo: Permission denied
答案2
考虑为该特定命令设置类似 setuid 的命令。我在命令 pwrstat(与我的 UPS 相关联)上使用了它,现在系统上的任何人都可以运行它。我使用了 chmod 命令来实现它。在我的情况下,chmod 命令如下所示:sudo chmod 4755 /usr/sbin/pwrstat