苏行不行

苏行不行

我想以 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"echoHello 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

相关内容