ligne de commande

chaps31chaps31 Membre
11:54 modifié dans API AppKit #1
Y-a-t'il un moyen d'intégrer des lignes de comande au sein d'un projet en cocoa ?
«1

Réponses

  • ChachaChacha Membre
    11:54 modifié #2
    dans 1228315797:

    Y-a-t'il un moyen d'intégrer des lignes de comande au sein d'un projet en cocoa ?

    Oui.
    Il y a bien sûr les appels système du genre "system()", mais sinon il y a la classe NSTask.

    +
    Chacha
  • schlumschlum Membre
    décembre 2008 modifié #3
    Sans oublier "popen" plus puissant que "system" et moins que NSTask (mais plus simple...)
  • AliGatorAliGator Membre, Modérateur
    11:54 modifié #4
    Plus d'infos et un petit exemple ici par exemple (mais y'en a d'autres qui traà®nent sur le net, du moment que tu sais qu'il faut chercher le terme "NSTask" ;)

    Sinon chez apple un peu aussi
  • chaps31chaps31 Membre
    11:54 modifié #5
    super, merci beaucoup NStask à  l'air un poil complexe mais par contre très très utile.
  • chaps31chaps31 Membre
    11:54 modifié #6
    J'en profite pour poser d'autres questions.

    - Y-a-t'il un moyen via cocoa de modifier le contenu d'un fichier ? remplacer le mot "trust" par "md5" dans le document par exemple.

    - Y-a-t'il un moyen via cocoa de modifier les autorisations d'accès à  un fichier et tout ses contenus ?

    Merci
  • schlumschlum Membre
    11:54 modifié #7
    dans 1228400151:

    J'en profite pour poser d'autres questions.

    - Y-a-t'il un moyen via cocoa de modifier le contenu d'un fichier ? remplacer le mot "trust" par "md5" dans le document par exemple.

    - Y-a-t'il un moyen via cocoa de modifier les autorisations d'accès à  un fichier et tout ses contenus ?

    Merci


    Euh, Cocoa c'est un framework, pas un chapeau magique...

    Pour modifier le contenu d'un fichier, charge son contenu dans un NSMutableString, fais les changements puis réécrit le dans le fichier.
    Pour les autorisations, voir "- (BOOL)setAttributes:(NSDictionary *)attributesofItemAtPath:(NSString *)patherror:(NSError **)error"... 10.5 only.
    Plus simple : "man 2 chmod"
  • chaps31chaps31 Membre
    11:54 modifié #8
    Je sens que je dérape par rapport au thème du forum qui est cocoa mais que voulez-vous c'est ici que je trouve les meilleures aides...  ::)

    Je cherche à  faire quelque chose en ligne de commande (je n'ai pas trouvé la solution ailleurs) qui se fait sans difficulté avec l'interface graphique de mac os x :

    - Un dossier "data" a pour utilisateur "postgres" et comme autorisation rwx

    - J'ouvre les infos (je suis en session admin dans mac os x), clique sur le cadenas rentre mon mot de passe dans la fenêtre d'identification qui apparait,  puis dans la fenêtre d'info de "data" rajoute "admin" dans la liste des utilisateurs avec droit en écriture et lecture puis ferme. Génial j'ai accès à  data. et dans le terminal j'ai rwx
    +  (que je ne comprends pas le "+" mais bon).

    Comment faire cela en ligne de commande ? Merci beaucoup.
  • AliGatorAliGator Membre, Modérateur
    11:54 modifié #9
    avec chmod et les ACL ;)
    man chmod pour plus d'infos
  • schlumschlum Membre
    11:54 modifié #10
    sudo /bin/chmod +a &quot;admin allow list&quot; data<br />sudo /bin/chmod +a &quot;admin allow add_file&quot; data
    
  • chaps31chaps31 Membre
    11:54 modifié #11
    Merci, je vais m'atteler à  comprendre et découvrir toute cette syntaxe du shell.
  • chaps31chaps31 Membre
    11:54 modifié #12
    argh ça marche pas ça change bien les autorisation mais pas possible d'ouvrir le dossier "data"... pourtant il perd son panneau sens interdit...

    j'ai enrichi la ligne de commande avec read,write... mais ça ne marche pas mieux, dans la fenêtre des informations du dossier admin est présent mais avec des droits "personnalisés"... Le but étant de pouvoir ouvrir ce dossier pour copier un fichier qu'il contient et de recoller dans ce même fichier ce que j'y ai copié mais modifié, puis par mesure de sécurité je retirerais le droit d'accès d'admin.

    une idée des options de chmod en ligne de commande qui correspondent à  "lecture et écriture" de la fenêtre information ? J'ai lu le man sans succès...

    PS : quand ce projet sera enfin bouclé je vous mettrais dans les remerciements du "à  propos de.."  :P
  • schlumschlum Membre
    décembre 2008 modifié #13
    Pour avoir le droit de rentrer dedans, il faut ajouter "search"...

    sudo /bin/chmod +a &quot;admin allow search&quot; data
    
  • chaps31chaps31 Membre
    11:54 modifié #14
    au final j'ai fais : [glow=yellow,2,300]sudo chmod uga=rwx[/glow]  alors que je voulais faire [glow=yellow,2,300]ugo[/glow] bien sûr...
    Et hop ça marche nickel, sauf que.... dans la fenêtre information maintenant j'ai un utilisateur "inconnu" en grisé qui peut lire et écrire et que je ne peux pas supprimer !!!

    C'est grave docteur ?
  • chaps31chaps31 Membre
    décembre 2008 modifié #15
    un [glow=yellow,2,300]sudo chmod go-rwx[/glow] a tout fait rentré dans l'ordre, faut que je sois vigilant avec les lignes de de commande... le jour où j'utiliserais [glow=yellow,2,300]rm[/glow]...

    POur voir j'ai fait [glow=yellow,2,300]sudo chmod go+rwx[/glow] et dans la fenêtre d'information il se cré toujours cet utilisateur inconnu, pas grave mais j'aurais préféré qu'il cré juste pour l'admin...
  • chaps31chaps31 Membre
    11:54 modifié #16
    Bon maintenant je souhaite tester ma ligne de commande en l'intégrant dans mon code (je me raproche du titre de ce post...) quel chemin je vise ? celui allant à  terminal.app ?

    Merci
  • AliGatorAliGator Membre, Modérateur
    11:54 modifié #17
    Que dit chown (pour jouer sur le owner et pas juste sur les droits de cet owner) ?
  • chaps31chaps31 Membre
    11:54 modifié #18
    Je souhaite juste ouvrir les droits modifier le fichier et remettre les droits comme avant pas changer l'utilisateur du fichier.

    Là  j'essaie NStask, marche pas pour l'instant, on est obligé de créer un pipe ?
  • AliGatorAliGator Membre, Modérateur
    11:54 modifié #19
    Heu attends... c'est quoi ta ligne de commande ? C'est pas une ligne incluant un sudo et nécessitant des privilèges admin au moins ? Parce que si c'est ça c'est un cas un peu particulier et ce n'est pas NSTask qu'il faut utiliser, mais le problème est un peu plus complexe (y'a bien une méthode simple mais qui ouvre une belle faille de sécurité dans ton programme alors bon)

    Si tu utilises une NSTask oui il faut créer un NSPipe aussi.
    En fait ce qu'on ne réalise souvent pas c'est que lorsqu'on est dans Terminal.app, on est dans un shell et du coup c'est le shell qui se charge de tout. Il instancie le process (enfin la task), crée les canaux d'entrée/sortie (pipes), et lis et écrit dans ces canaux pour récupérer ce que tu tapes dans le shell éventuellement, et afficher le résultat de ta task à  l'écran dans le terminal.

    Quand tu es dans ton code, il faut tout faire toi même : créer la task, y connecter les canaux de communication (pipes) et lire/écrire dans ces canaux. C'est comme ça. Maintenant franchement la première fois ça fait un peu peur, mais après on s'y fait :D
    Par contre si tu as besoin de privilèges admin c'est une autre paire de manches, pas tant côté code mais côté tout faire proprement pour éviter les failles.
  • chaps31chaps31 Membre
    11:54 modifié #20
    argh, et oui j'ai un sudo... Un indice ?
  • AliGatorAliGator Membre, Modérateur
    11:54 modifié #21
    Bon alors dans ce cas c'est pas par les NSTask qu'il faut passer, mais par SFAuthorization pour obtenir les droits (le droit [tt]kAuthorizationRightExecute[/tt] en l'occurence) -- avec affichage d'une boite de dialogue standard du SecurityFramework avec le cadenas et qui te demande le login et pass admin --, puis par la fonction AuthorizationExecuteWithPrivileges(...) pour exécuter ta commande en lui passant les droits admin obtenus (enfin la [tt]authorizationRef[/tt] de ton SFAuthorization)

    Mais je te conseille de lire la doc à  ce sujet, parce que y'a un sacré petits paquets de notions qu'il est bon de connaà®tre avant de se lancer là  dedans, en particulier pour éviter les risques de failles de sécurité, etc. (ben tu pensais faire comment avec sudo pour que l'utilisateur saisisse son mot de passe de façon sécurisée et soit assuré que tu ne le stockes pas de ton côté ?)

    Tu pourras venir me (nous) reposer des questions ensuite si besoin, moi j'ai mis un peu de temps à  appréhender tous les concepts lorsque j'ai eu à  faire ça donc ce sera mieux pour t'expliquer en cas de question si tu as déjà  les bonnes notions ;) Et puis la doc Apple explique aussi pas mal les risques de failles et les bonnes pratiques selon tes besoins. Et si t'es sage je te montrerais un bout de code  ;D

    Sinon petite précision, une lacune connue  de AuthorizationExecuteWithPrivileges : on ne peux pas récupérer le stderr de la commande, on a juste accès au stdin/stdout. (Ni le PID de la commande exécutée si on en avait besoin, ce qui est le 2e plus grand reproche fait à  cette méthode).
  • chaps31chaps31 Membre
    11:54 modifié #22
    Merci encore, avec la doc apple le bouquin cocoa que je viens d'acheter je vais atteler mon cerveau à  cette tâche, à  t'écouter je vais peut-être avoir besoin de watercooling pour mes neurones  :P
  • chaps31chaps31 Membre
    11:54 modifié #23
    Pfff.... Mon watercooling neuronal ne doit pas être assez puissant, allez je continue, juste une question histoire de ne pas jouer les Don Quichotte et d'être rassuré, dites moi que ce que je veux faire est faisable en Cocoa :

    - Ouvrir l'accès d'un dossier "data" à  l'admin pour qu'il puisse le modifier (dossier créé par postgreSQL et par défaut réservé à  son utilisateur postgres), sans problème via la fenêtre information ou un sudo chmod dans le terminal et visiblement faisable pour AliGator en cocoa, mais rien dans Appkido, donc doc apple pour exploiter tes infos.

    - ouvrir un fichier (pg_hba.conf) de ce dossier "data", contient du texte, et remplacer toutes les occurences de "trust" par "md5". sauvegarder le fichier modifié (shlum conseillait de copier le contenu du fichier le modifier puis le recoller).

    - Remettre l'accès au dossier "data" dans son état par défaut pour empêcher tou nouvel accès.

    Voilà  sur quoi je bute depuis... 2-3 semaines... Si tout ça vous semble jouable en Cocoa je m'acharne, en effet cela revient après installation de postgreSQL (un pkg existe pour ça) à  sécuriser l'accès qui est ouvert à  tous par défaut. Après fort heureusement postgreSQL a prévu une bibliothèque C, un #import et direct dans mon code objective-c et ça roule.
    Vu que j'ai beaucoup de mal  à  trouver des solutions, une fois fini je pourrais mettre le code ici pour les futurs intéressés.
  • AliGatorAliGator Membre, Modérateur
    décembre 2008 modifié #24
    Apple précaunise pour ce genre de cas de faire un outil externe dédié à  la tâche nécessitant les privilèges admin. Tu peux regarder dans la doc relatives aux installeurs où c'est décrit comment faire pour les installeurs qui ont besoin de faire des opérations avec privilèges (ça j'ai jamais essayé), ou faire un petit utilitaire qui fait ça, lui mettre le setuid bit, et le faire exécuter par ton appli.

    D'ailleurs si ce n'est que ça à  faire (modifier le contenu de ton fichier protégé), ça peut peut-être se faire avec un script shell et avec sed (d'une part ça t'évitera de coder le remplacement de "trust" par "md5" toi-même vu que sed le fait très bien, et en plus ça peut rassurer le geek qui irait trifouiller ton package s'il peut lire ce que tu fais comme actions plutôt qu'un binaire obscur ^^)

    Donc l'idée ce serait de créer un script shell genre tout simplement
    #!/bin/sh<br />cd ~/data    # l&#39;emplacement de ton dossier data, à  adapter selon le besoin<br />mv pg_hba.conf pg_hba.conf.bak<br />sed s/trust/md5/ pg_hba.conf.bak &gt;pg_hba.conf
    
    Et ensuite d'utiliser le code indiqué par Apple ici pour exécuter ce script avec les privilèges root.

    J'ai pas testé (ni mon script shell pour remplacer "trust" par "md5" ni le fait de voir si ça s'exécute bien en root avec le code Apple) mais je te laisse faire mumuse avec.

    PS : Note que côté sécurité je ne sais pas ce que ça vaut de faire un script shell, modifiable potentiellement par n'importe qui, mais en même temps si tu utilises un binaire, c'est pareil il peut potentiellement être remplacé par un autre binaire par qqun de mal intentionné... Faudrait écrire le shell à  la volée à  la limite, ou encore vérifier le md5 du shell (ou du binaire) avant... enfin ça porte à  réfléchir.
  • schlumschlum Membre
    11:54 modifié #25
    Une autre solution facile et pratique, c'est de créer un .pkg qui nécessite les droits admins et qui fait ce boulot dans le script "postflight"
    (vu que c'est une problématique d'" installation ").
  • chaps31chaps31 Membre
    11:54 modifié #26
    Merci beaucoup c'est impec, je vais passer par des lignes de commandes, seul hic purement postgres, dès que je modifie le pg_hba.conf le serveur ne démarre plus il est planté faut que je le réinstalle.... très étrange, vu qu'il est demandé dans la doc postgres de modifier ce fichier...

    Mais merci, utile toutes ces connaissances dans le shell ;)
  • chaps31chaps31 Membre
    11:54 modifié #27
    Argh, mais bon sang comment fait-on un script shell ???? J'ai parcouru le net lu la doc apple.. fais des test ça ne marche jamais.  :crackboom:- :crackboom:-

    Il est écrit qu'il suffit de mettre
    #! /bin/bash
    LESLIGNES

    Ce que je fais, je rajoute l'extension .sh au fichier, fais en ligne de commande un chmod +x pour le fichier et lorsque je l'execute erreur erreur... Il faut dire que le +x rajoute tout un tas de truc en début de fichier qui visiblement ne plait pas au shell... Je nage complètement... Désolé de vous demander des choses qui doivent vous paraitre basique mais je ne vois pas comment faire...
    Au passage mon chmod +x modifier définitivement le fichier, une fois intégré à  mon package d'installation il s'exécutera sans problème sur un autre mac ?

    Question subsidiaire : je peux ?  ::) j'ai un pkg qui installe postgresql est-il possible de l'intégrer dans mon package d'installation ? Ce qui me permettra en plus de mettre un script preflight de vérification que postgresql n'est pas déjà  installé sur l'ordi ;)

    Merci
  • schlumschlum Membre
    11:54 modifié #28
    dans 1229074542:

    Argh, mais bon sang comment fait-on un script shell ???? J'ai parcouru le net lu la doc apple.. fais des test ça ne marche jamais.  :crackboom:- :crackboom:-

    Il est écrit qu'il suffit de mettre
    #! /bin/bash
    LESLIGNES

    Ce que je fais, je rajoute l'extension .sh au fichier, fais en ligne de commande un chmod +x pour le fichier et lorsque je l'execute erreur erreur... Il faut dire que le +x rajoute tout un tas de truc en début de fichier qui visiblement ne plait pas au shell... Je nage complètement... Désolé de vous demander des choses qui doivent vous paraitre basique mais je ne vois pas comment faire...
    Au passage mon chmod +x modifier définitivement le fichier, une fois intégré à  mon package d'installation il s'exécutera sans problème sur un autre mac ?

    Question subsidiaire : je peux ?  ::) j'ai un pkg qui installe postgresql est-il possible de l'intégrer dans mon package d'installation ? Ce qui me permettra en plus de mettre un script preflight de vérification que postgresql n'est pas déjà  installé sur l'ordi ;)

    Merci


    C'est quoi le script exact ? Essaie /bin/chmod ; peut-être qu'il n'a pas accès à  la variable d'environnement $PATH

    Vérifier que postgreSQL n'est pas déjà  installé, c'est pas une mince affaire. Dans le pire des cas, il est installé dans un endroit exotique et n'est pas lancé, donc tu ne peux rien vérifier.
    Pourquoi ne pas l'installer toi même à  un endroit dédié à  ton application, et le lancer avec un port dédié à  ton application ?  ???
  • chaps31chaps31 Membre
    11:54 modifié #29
    L'installeur de postgre installe un paquet de fichier, je me vois mal installer tout ça moi-même... Je pensais juste vérifier qu'un fichier dans le dossier startupitem installé par postgre n'y est pas déjà  présent idem pour le dossier PostgreSQL8.

    Donc mon installeur devrait exécuter un script shell pour vérifier cela, si il n'y a rien il lance le pkg de postresql, sinon il passe à  l'étape suivante le script shell de sécurisation de postgres (aucun effet si postgres est déjà  sécurisé) et de création des users... puis installation de mon soft.

    Mais comment lancer le pkg de postgres au sein de mon pkg ?

    Si je ne me trompe pas  mon script est une succession de lignes de commandes comme je taperais dans le terminal genre

    sudo -u postgres chmod -R a+rwx /Library/PostgreSQL8/data
    cd /Library/PostgreSQL8/data
    mv pg_hba.conf pg_hba.conf.bak
    etc...

    Je peux laisser les sudo ? Parce-que sinon comment me connecter au nom de postgres dans la première ligne...

    Est-il indispensable de faire chmod +x, juste rajouter .sh ne suffit pas ? Et en faisant chmod +x je modifie le fichier quel que soit l'ordi utilisé ?

    Merci encore et désolé pour ma totale méconnaissance du shell et des pkg...
  • schlumschlum Membre
    11:54 modifié #30
    Pour installer un .pkg au sein d'un installeur, il faut faire un .mpkg (méta-package)
    Oui, tu peux laisser sudo pour t'" impersonnifier " en n'importe quel user
  • chaps31chaps31 Membre
    11:54 modifié #31
    Génial mon script marche, reste plus qu'à  lire de la doc sur les metapkg. Ceci dit j'ai juste un problème, mon script commence par lancer le serveur postgreSQL, le soucis c'est que la ligne suivante qui requière que le serveur soit démarrée ne s'exécute pas car le shell l'exécute sans attendre que le serveur soit démarré...

    J'utilise bien des ";" pas des "&" entre les commandes donc le shell attends que la commande soit exécutée avant de passer à  la suivante, sauf qu'il envoie bien un "start" à  postgreSQL mais pour lui le boulot est fini il enchaine... Un "wait" ne sert donc à  rien (je m'en doutait vu que j'ai mis des points-virgules), j'ai vérifié ça en mettant un "sleep 10;" ça laisse le temps au serveur de démarrer et là  c'est bon ça marche.

    Mais cette solution n'est pas terrible d'abord est-ce que le serveur démarrera sur tous les ordis en 10 secondes ? Pas certains même si c'est probable, je me trompe peut être mais je pense que la seule solution est de faire une boucle en trouvant une fonction dans l'executable Unix de postgreSQL qui informe sur l'état du serveur et de sortir de la boucle lorsque cette état est  à  OK. Mon idée semble tenir la route non ? Mais si pour une raison inconnue le serveur ne démarre pas que fait le shell ? Il tourne à  l'infini ?? Problème si c'est le cas...

    Autre question (il semble toujours y en avoir une de plus...) . Pour empêcher que quiconque puisse lire le script, sans que cela empêche sont exécution par le shell, suffit-il de faire un chmod a+x-rw ? Je ne sais pas d'ailleurs si enchainer des + et des - est possible, pas grave sinon, je ferais en 2 lignes. Et dernière question (si, si) le chmod modifie le fichier en interne et les autorisations seront ainsi quelque soit l'ordi où on copie le fichier ou cette modif n'est valable que sur mon ordi ?

    ENcore merci  o:)
Connectez-vous ou Inscrivez-vous pour répondre.