0

我有一个名为 sudo -i -u user /bin/bla/whatever 的 bash 脚本。直到最后一次更新到 CentOS 5.8 之前,它都运行良好。这是 sudoers 文件中的相应条目:

Runas_Alias TEST = user1, user2
Defaults:test always_set_home
test ALL=(TEST) NOPASSWD: /bin/bash -c /bin/bla/whatever, /bin/bla/whatever

如果我使用 sudo -i 它似乎调用了命令

"/bin/bash -c /bin/bla/whatever"

(关于安全日志)。现在,自从更新以来,它似乎调用

"/bin/bash -c \/bin\/bla\/whatever"

因此是不允许的。我试图将 sudoers 文件中的行更改为

test ALL=(TEST) NOPASSWD: /bin/bash -c /bin/bla/whatever, /bin/bla/whatever, /bin/bash -c \/bin\/bla\/whatever

但那是不允许的语法,所以我尝试了:

test ALL=(TEST) NOPASSWD: /bin/bash -c /bin/bla/whatever, /bin/bla/whatever, /bin/bash -c \\/bin\\/bla\\/whatever

这是有效的语法,但也不起作用。

如果我使用 sudo -H -u user /bin/bla/whatever 它工作正常。即使我在 sudoers 文件中允许 /bin/bash ,但这将允许任何事情.....

有任何想法吗?

埃里克

4

2 回答 2

1

你在sudo -i -u user /bin/bla/whatever争论吗?来自man sudoers

一个简单的文件名允许用户使用他/她希望的任何参数运行命令。但是,您也可以指定命令行参数(包括通配符)。或者,您可以指定 "" 以指示该命令只能在没有命令行参数的情况下运行。

所以一旦你添加了/bin/bash -c你现在指定的参数,它们必须完全匹配。

这是一个示例sudoers行:

test ALL=(ALL) NOPASSWD: /bin/bash -c /bin/true, /bin/bash -c /bin/true *, /bin/true *

我可以这样做:

sudo /bin/true
sudo /bin/true foo
sudo -u /bin/true
sudo -u /bin/true foo

不会 sudo true因为那变成bash -c true哪个不匹配bash -c /bin/true

于 2014-02-13T21:19:37.820 回答
1

刚刚检查了我的 Fedora 16 系统上的 sudo 手册页,它说:

   -i [command]
               The -i (simulate initial login) option runs the shell specified by the password database entry of the target user as a login shell.  This means
               that login-specific resource files such as .profile or .login will be read by the shell.  If a command is specified, it is passed to the shell
               for execution via the shell's -c option.

因此,似乎没有必要bash -c在您的 sudoers 命令定义中指定。

如果您调用该命令,sudo -i /bin/bla/whatever您应该只需要在 sudoers 文件中添加以下内容:

test ALL=(TEST) NOPASSWD: /bin/bla/whatever

我可以在我的 fedora 16 系统上重现该问题,我尝试的 sudoers 文件没有任何更改有任何影响。我找不到使这项工作所需的任何其他配置。我只能说使用'-H -u ...'。

于 2012-06-01T08:40:59.783 回答