2010-04-06 8 views
2

J'écris un programme en Objective-C (Xcode 3.2, sur Snow Leopard) qui est capable soit de bloquer sélectivement certains sites pendant une durée, soit de n'autoriser que certains sites (et donc de bloquer tous les autres) pendant une durée. Le raisonnement derrière ce programme est plutôt simple. J'ai tendance à être distrait quand j'ai un accès complet à Internet, mais j'ai besoin d'un accès Internet pendant mes heures de travail pour accéder à un certain nombre de sites Web liés au travail. Clairement, ce n'est pas un blocage permanent, mais cela m'aide à me concentrer chaque fois que je me retrouve à me promener un peu trop. À l'heure actuelle, j'utilise un script Unix appelé via AppleScript pour obtenir des autorisations d'administrateur. Il active ensuite un certain nombre de règles ipfw et efface celles-ci après une durée spécifique pour restaurer un accès Internet complet. Simple et efficace, mais puisque je cours en tant qu'utilisateur standard, il devient fastidieux d'entrer mon mot de passe administrateur chaque fois que je veux aller "hors ligne". De plus, c'est une excellente opportunité d'apprendre à travailler avec XCode et Objective-C. À l'heure actuelle, tout fonctionne comme prévu, moins le blocage réel. Je peux ajouter un certain nombre de sites dans une liste, spécifier si je veux bloquer ou autoriser ces sites Web et je peux "commencer" le blocage en spécifiant une durée jusqu'à laquelle je veux rester "hors ligne".Comment exécuter une application en tant que root sans demander de mot de passe administrateur?

Cependant, je trouve difficile d'obtenir des informations claires sur la façon dont je peux exécuter une commande Unix privilégiée à partir d'Objective-C. Idéalement, je voudrais être en mesure de stocker des informations concernant le compte administrateur dans le trousseau pour les utiliser plus tard, de sorte que je puisse simplement passer en mode "hors ligne" avec la commodité de cliquer sur un bouton. Encore plus idéalement, il y a peut-être une classe en Objective-C avec laquelle je peux bloquer l'accès à certains/tous les sites web pour cet utilisateur particulier sans avoir besoin de s'appuyer sur des commandes Unix privilégiées. Une troisième possibilité est de démarrer ce programme avec les permissions root et de réduire les permissions jusqu'à ce que j'en aie besoin, mais puisqu'il s'agit d'une application GUI qui est imbriquée dans la barre de menus d'OS X, les résultats sont plutôt gênants. et chaque fois avec la permission de la racine n'est pas une tâche facile.

Toute personne pouvant m'offrir des conseils ou des conseils? S'il vous plaît, pas d'avertissements de sécurité, je suis pleinement conscient que ce que je veux faire est une menace potentielle pour la sécurité.

+0

Si vous utilisez Firefox, il existe déjà un plugin appelé LeechBlock: https://addons.mozilla.org/en-US/firefox/addon/4476 (bien sûr, vous devez être discipliné pour ne pas utiliser Safari ou tout autre navigateur ;)) –

+1

Si vous réduisez votre question à environ un court paragraphe, je suis sûr que beaucoup plus de gens répondront. Il n'y a pas besoin de connaître toutes les circonstances dans ce cas. –

Répondre

2

Si vous voulez faire quelque chose avec des privilèges d'administrateur, et que vous ne voulez pas avoir à vous authentifier à chaque fois, il semble que vous ayez besoin de regarder setuid.

Créez un petit exécutable de ligne de commande pour modifier la règle, puis définissez le propriétaire de cet outil sur root. Ensuite, définissez le bit setuid. Maintenant, vous pouvez l'exécuter en tant qu'utilisateur et il fonctionnera en tant que root.

Regardez ici pour plus d'informations: http://en.wikipedia.org/wiki/Setuid

+0

Setuid ne devrait plus être utilisé, launchd peut le remplacer. (C'est beaucoup plus difficile à utiliser si.) –

2

Vous devez créer un processus distinct qui fonctionne avec des privilèges plus élevés. Jetez un oeil à la BetterAuthorizationSample sur la façon d'exécuter de telles applications d'aide en utilisant launchd.

+2

Oui, cela fonctionnerait aussi. Il est absurdement compliqué cependant;) –

+0

@Ken: +1, Vous avez absolument raison, j'utilise launchd pour l'une de mes applications et c'est horrible de travailler avec. (Je suis sûr que c'est plutôt bon pour des tâches plus simples ...) –

+1

Je pense que je vais préférer l'approche de Ken. J'ai essayé de me frayer un chemin à travers le BetterAuthorizationSample, mais c'est terriblement complexe pour la tâche plutôt simple que j'essaye d'accomplir :). – kvaruni

Questions connexes