2010-02-11 4 views
3

Étant donné qu'il ya un fichier appelé copystuff dans le dossier des ressources dans un un projet Xcode, et ce fichier se lit comme suit:Exécuter un script Bash en tant que root avec Objective-C/Cocoa

#!/bin/sh 
cp -R /Users/someuser/Documents /Users/admin/Desktop 

Et si ce bit de le code ci-dessous est lié à un bouton dans IB ... il copiera le répertoire/Users/someuser/Documents vers/Users/admin lorsque le bouton est enfoncé dans une application Cocoa ... Il fonctionne quand l'application est lancée dans un compte administrateur (en utilisant OS X 10.5.x ici) ...

NSTask *task = [[NSTask alloc] init]; 
[task setLaunchPath:@"/bin/sh"]; 
[task setArguments:[NSArray arrayWithObjects:[[NSBundle mainBundle] 
pathForResource:@"copystuff" ofType:@"sh"], nil]]; 
[task launch]; 

Ma question est .. est-il un moyen d'avoir NSTask exécuter un script en cours d'exécution en tant que r oot alors que ce code est appelé depuis un compte non administrateur? Ou a-t-on demandé d'une autre façon.Can Objective-C peut être codé pour exécuter des scripts à partir de say/usr/bin en tant que root à partir d'un compte non administrateur?

Répondre

7

Je vous déconseille fortement d'utiliser un script externe comme celui-ci. Il est préférable de le faire avec NSFileManager et de garder cela à l'intérieur du code contrôlé. Mais à la question de savoir comment devenir root, vous voulez regarder Authorization Services. Ce site vous explique comment créer une application qui augmente ses privilèges, y compris les éléments d'interface utilisateur appropriés.

4

Si je comprends ce que vous voulez faire, vous essayez d'avoir un utilisateur non privilégié capable d'effectuer une action privilégiée sans avoir besoin de s'authentifier?

Les scripts shell setuid sont considérés comme un risque de sécurité gigantesque, ils sont donc interdits par le noyau. Cependant, si vous voulez écrire un programme exécutable séparé, vous pouvez définir les bits d'exécution set-user-ID-on-execution ou set-group-ID-on-execution et obtenir le comportement souhaité. Soyez prudent, vous êtes maintenant au pays de grands problèmes de sécurité potentiels ...

man chmod pour plus d'informations.

Voici un exemple rapide et sale:

$ echo "Hello, world!" > file 
$ sudo chown root file 
$ sudo chmod 600 file 
$ cat file 
cat: file: Permission denied 

Mais je peux écrire un programme:

#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) 
{ 
    setuid(0); 
    system("cat file"); 
    return 0; 
} 

Ce qui peut faire ce que nous aimerions:

$ cc -Wall -o app main.c 
$ chown root app 
$ chmod 4755 app 
$ ./app 
Hello, world! 
+0

C'est à peu près exactement ce que j'essaie de faire ... Pour être moins énigmatique, j'ai 3 comptes sur une image OS 10.5 déployée dans un cadre éducatif. (administrateur, enseignant, étudiant). Les comptes d'enseignant et d'étudiant ne sont pas des administrateurs. Sur une demande, j'essaie d'autoriser le compte d'enseignant non administrateur à copier des éléments du compte d'étudiant sur le bureau du professeur. L'application fonctionne avec succès depuis le compte admin, mais Je veux pouvoir donner à l'enseignant certaines de ces actions prvileged sans leur donner le mot de passe d'admin .... – cit

+2

Vous pourriez avoir plus de chance regardant dans des options d'autorisations plus sophistiquées, comme des listes de contrôle d'accès: http://aplawrence.com/ MacOSX/acl.html –

Questions connexes