3

Fedora 17 KDE x64 と Qt 4.8.1 を実行しています。

Ubuntu とは対照的に、Fedora は最初に作成されたユーザーに sudo 権限を与えず、最初に作成されたユーザーを/etc/sudoersファイルに追加しません。したがって、プログラムを Fedora 17 KDE (Gnome などのスピンはテストしていません) にインストールする場合は、root(ではなくsudo) 特権が必要です。したがって、3 つのレベルの権限があります (権限のレベルに従って降順でリストされています)。

1) ルート 2) sudo 3) ユーザー

Fedora 17 KDE では、rootユーザー アカウントにアクセスできる場合、ファイルを編集して次の行を追加するsudoだけで、必要な他のユーザーに権限を与えることができます。/etc/sudoers

user ALL = (ALL) ALL

… 線の下に:

root ALL = (ALL) ALL

usersudo アクセスを許可するアカウントの名前に置き換えます。

ただし、すべてのユーザーがrootユーザーのアカウントにアクセスできるわけではありません。これが、ユーザーが一部のユーザー アカウントにrootスーパーユーザー ( sudo) 権限を付与できる理由です。

私がしたいのは、アプリケーションを実行している現在のユーザーがスーパーユーザーとして登録されているかどうかを確認することです。もしそうなら、ツールにパスワードを要求するツールを/usr/bin/kdesu使用させます。/usr/bin/sudosudo

ユーザーがスーパーユーザーでない場合/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。これを行う1つの方法は次のとおりです。

#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 に答える