Qt, Linux, vérifiez si un utilisateur a des privilèges sudo
Je suis sous Fedora 17 KDE x64 et Qt 4.8.1.
En contraste avec Ubuntu, Fedora, ça ne donne pas le premier utilisateur créé des privilèges sudo et il n'ajoute pas le premier utilisateur créé à l' /etc/sudoers
fichier. Par conséquent, lors de l'installation de programmes sur Fedora 17 KDE (ne l'ai pas testé le Gnome et etc. tours), il nécessite root
(pas sudo
) les privilèges. Donc, nous avons trois niveaux de privilèges (énumérés par ordre décroissant selon le niveau de privilèges):
1) de la racine
2) sudo
3) l'utilisateur
Dans Fedora 17 KDE si vous avez accès à la root
compte utilisateur, vous pouvez donner sudo
privilèges d'un autre utilisateur que vous souhaitez simplement en modifiant l' /etc/sudoers
fichier et l'ajout de la ligne:
user ALL = (ALL) ALL
... en dessous de la ligne:
root ALL = (ALL) ALL
Remplacer user
avec le nom du compte que vous souhaitez donner sudo accès.
Mais pas à chaque utilisateur a accès à la root
compte de l'utilisateur. C'est pourquoi la root
utilisateur peut donner de super-utilisateur (sudo
) les privilèges de certains comptes d'utilisateurs.
Ce que je veux, c'est de vérifier si l'utilisateur actuel de l'exécution de l'application est enregistrée en tant que super-utilisateur. Si donc je vais faire le /usr/bin/kdesu
l'utilisation des outils de la /usr/bin/sudo
outil qui demande sudo
mot de passe.
Si l'utilisateur n'est pas super-utilisateur je laisse /usr/bin/kdesu
se comporter comme il le fait, par défaut, il utilise le /usr/bin/su
outil qui nécessite root
mot de passe.
Actuellement, je suis en utilisant getenv('USER')
(“nom d'utilisateur” sur Windows, mais j'ai besoin de cette fonctionnalité sur Linux seulement) pour obtenir de l'utilisateur actuel. Le nom de l'utilisateur actuel peut être acquis en parcourant QProcess::systemEnvironment()
où le nom d'hôte et les variables UTILISATEUR sont répertoriés.
L'analyse de la /etc/sudoers
fichier n'est pas une option depuis l'ouverture du fichier nécessite sudo
ou root
privilèges.
Mais je ne veux pas savoir si l'utilisateur actuel est l'utilisateur "root", je veux vérifier si l'utilisateur possède les privilèges du super-utilisateur.
sudo -l
listes sudo droits de l'utilisateur courant. Si vous l'exécutez, l'utilisateur doit saisir son mot de passe. Vous pouvez utiliser quelque chose comme expect
pour vérifier si l'utilisateur a déjà tapé le mot de passe avant et est actuellement dans un "sudo fenêtre de temps".Je pense que l'utilisateur ne doit pas entrer son mot de passe pour
sudo -l
. Je viens de vérifier sur un compte sans droits et la commande n'a pas à demander un mot de passe, mais simplement permis de commandes.vous n'êtes pas à l'inscription de toutes les complications encore. Juste pour ajouter un peu: dependending sur la config, vous devez être dans le groupe "wheel" pour être autorisé à utiliser su pour devenir root. Cependant, getgid() pourrait être votre ami: si les listes de racine, vous êtes ok, si c'listes de roue, vous pourriez être ok, etc.
OriginalL'auteur Ivan | 2012-07-01
Vous devez vous connecter pour publier un commentaire.
Mise à jour Vous avez besoin d'un (pseudo)terminal pour exécuter
sudo
. Voici une façon de le faire:Exécuter ceci:
runsudo -l
etrunsudo -l /foo/bar/baz
par exemple.QProcess process; QString superUserCommands; process.start( "/usr/bin/sudo -l" ); while ( process.waitForReadyRead() ) { superUserCommands = QString::fromAscii( process.readAllStandardOutput().data() ).trimmed(); }
De cette façon, je devrais être en mesure d'obtenir les commandes sudo disponible pour l'utilisateur actuel. Mais l'Application de la fenêtre de Sortie de Qt Creator états: sudo: désolé, vous devez disposer d'un terminal lancer la commande sudo C'est probablement parce qu'il est requiretty de mon compte utilisateur et je suis de l'exécution d'une commande de terminal via une application graphique. Le QProcess retourne le code 1. system() retourne 256.Oh oui. Désolé, oublié de l'ats. Si vous ne disposez pas d'un ats vous pouvez en créer un de la même manière xterm ou sshd les créer (via
posix_openpt(3)
et amis), ou l'appel à un peu de la fonction d'utilité appeléforkpty(3)
de-lutil
. J'ai ajouté un exemple de code pour la réponse.OriginalL'auteur n.m.