ligne de commande
chaps31
Membre
Y-a-t'il un moyen d'intégrer des lignes de comande au sein d'un projet en cocoa ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Oui.
Il y a bien sûr les appels système du genre "system()", mais sinon il y a la classe NSTask.
+
Chacha
Sinon chez apple un peu aussi
- 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"
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.
man chmod pour plus d'infos
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
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 ?
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...
Merci
Là j'essaie NStask, marche pas pour l'instant, on est obligé de créer un pipe ?
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
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.
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).
- 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.
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 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.
(vu que c'est une problématique d'" installation ").
Mais merci, utile toutes ces connaissances dans le shell
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 ? ???
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...
Oui, tu peux laisser sudo pour t'" impersonnifier " en n'importe quel user
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