3

我正在运行 Fedora 17 KDE x64 和 Qt 4.8.1。

与 Ubuntu 相比,Fedora 不授予第一个创建的用户 sudo 权限,也不会将第一个创建的用户添加到/etc/sudoers文件中。因此,在 Fedora 17 KDE 上安装程序(尚未测试 Gnome 等)时,它需要root(不是sudo)权限。所以,我们有三个级别的权限(按照权限级别降序排列):

1) 根 2) 须藤 3) 用户

在 Fedora 17 KDE 中,如果您有权访问root用户帐户,您可以通过编辑文件并添加以下行来授予sudo您想要的任何其他用户权限:/etc/sudoers

user ALL = (ALL) ALL

… 下线:

root ALL = (ALL) ALL

替换user为您希望授予 sudo 访问权限的帐户的名称。

但并非每个用户都可以访问root用户的帐户。这就是root用户可以将超级用户 ( sudo) 权限授予某些用户帐户的原因。

我想要检查运行应用程序的当前用户是否注册为超级用户。如果是这样,我将使该/usr/bin/kdesu工具使用/usr/bin/sudo要求输入sudo密码的工具。

如果用户不是超级用户,我会/usr/bin/kdesu保持默认行为 - 它使用/usr/bin/su需要root密码的工具。

目前,我正在使用getenv('USER')(Windows 上的“USERNAME”,但我只需要 Linux 上的此功能)来获取当前用户。可以通过遍历QProcess::systemEnvironment()列出 HOSTNAME 和 USER 变量的位置来获取当前用户的名称。

解析/etc/sudoers文件不是一个选项,因为打开文件需要sudoroot特权。

4

2 回答 2

3
   man sudo
   [...]
   -l[l] [command]
               If no command is specified, the -l (list)
               option will list the allowed (and forbidden)
               commands for the invoking user (or the user
               specified by the -U option) on the current
               host.  If a command is specified and is
               permitted by sudoers, the fully-qualified
               path to the command is displayed along with
               any command line arguments.  If command is
               specified but not allowed, sudo will exit
               with a status value of 1.  If the -l option
               is specified with an l argument (i.e. -ll),
               or if -l is specified multiple times, a
               longer list format is used.

更新您需要一个(伪)终端才能运行sudo. 这是一种方法:

#include <pty.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>

int main (int argc, char* argv[])
{

    int status, master;
    pid_t respid, pid = forkpty (&master, 0, 0, 0);
    if (pid == 0) {
        /* we are child */
        argv[0] = "/usr/bin/sudo"; /* I know it's a sin... just for a demo */
        execve("/usr/bin/sudo", argv, 0);
    }
    else if (pid > 0) {
        /* we are parent */
        respid = waitpid(pid, &status, 0);
        fprintf (stderr, "sudo exited with status %d\n", 
                   WEXITSTATUS(status));
        }
    }
    else {
        fprintf (stderr, "could not forkpty\n");
    }
}

运行这个:runsudo -l例如runsudo -l /foo/bar/baz

于 2012-07-01T12:01:32.903 回答
0

请在单行脚本下运行。
它将列出所有具有 sudo 权限的用户,而不是:

for i in $(awk -F ':' '{print $1}' /etc/passwd ); do sudo -l -U $i ; done
于 2020-10-21T10:25:19.937 回答