CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Débutant en Terminal, en apprentissage ^

achdezo
achdezo
Niveau 10
10 février 2005 à 21:38:25

Bin essaye.

--- Après essais sur une session simple utilisateur

Dock & Finder relancement automatique.
loginwindow -> Essais donc.

Lord_FNX
Lord_FNX
Niveau 8
10 février 2005 à 22:05:49

bah, j´ai pas envie de prendre des risques avec mon mac mini tout neuf.

Zibook
Zibook
Niveau 8
11 février 2005 à 00:47:18

merci guiiig grâce a ta page j´ai réussi :ok:

:merci:

guiiig
guiiig
Niveau 10
11 février 2005 à 00:53:47

De rien zibook, " anytime" . .. :-)

zibook  
Posté le 10 février 2005 à 20:11:06

au fait guiiig la premiere réponse que tu m,as fournit c´est exactement ce que j´ai essayé si tu regarde bien... et c´est sur cette page que jai pris le code

je me doutais bien que tu avais pris cette page là. Mais si tu regardes bien le site n´a pas été mis à jour depuis à peu près 3 ans. Et sauf erreur, ya 3 ans Panther n´étais pas encore disponible. Pas étonnant donc que la commande présente sur le page soit pour la version 2 de OSX ( Jaguar si tu préféres :p) )

Aller bonne nuit zib´ :-)))

Zibook
Zibook
Niveau 8
11 février 2005 à 01:02:39

bonne nuit guiiig ; ) et merci encore

The_Warrior_
The_Warrior_
Niveau 7
11 février 2005 à 12:26:22

By the way, une tite question, en faisant un netstat grep | tcp

-bash: tcp: command not found
netstat: kvm not available

kvm --> kesako ?

achdezo
achdezo
Niveau 10
11 février 2005 à 17:31:31

Warrior> ´man kvm´ :)

Lord_FNX> Le matériel ne peut pas être abîmé par un test fait à partir d´un simple utilisateur.

panther751
panther751
Niveau 10
11 février 2005 à 19:09:25

The_WarrioR_ >

pas: netstat grep | tcp
mais: netstat | grep tcp

achdezo
achdezo
Niveau 10
12 avril 2005 à 07:46:42
    • nostalgie **
Battx
Battx
Niveau 10
12 avril 2005 à 15:35:07

Faudrait que je m´y remette . ..
Je me suis finalement mis au HTML/PHP, je peut faire des choses plus concretes avec...

achdezo
achdezo
Niveau 10
12 avril 2005 à 18:26:02

Zerf.

panther751
panther751
Niveau 10
12 avril 2005 à 18:55:47

cd / && ls | grep var | sed s/var/Bonjour/

( ou comment écrire une commande qui ne sert à rien)

achdezo
achdezo
Niveau 10
12 avril 2005 à 18:59:33

Ca va tu te la pètes bien avec ton ptit ´sed´ ?

panther751
panther751
Niveau 10
12 avril 2005 à 19:01:07

Oui pourquoi? ( La commande que je vient de découvrir il y a 2 jours)

achdezo
achdezo
Niveau 10
12 avril 2005 à 19:09:47

Euh, pour rien.

achdezo
achdezo
Niveau 10
12 avril 2005 à 21:28:45

Mais tu sais faire que ça, ou...

Lutin-de-la-CIA
Lutin-de-la-CIA
Niveau 9
12 avril 2005 à 21:30:35

[Hommage]
A moi.
[/Hommage]

Bigloo
Bigloo
Niveau 10
22 octobre 2005 à 20:23:20

Je sais que tout le monde a tendance à s´en battre l´oeuf de savoir comment les choses marchent mais j´éprouve une besoin irrépressible de publier ceci.

Nous allons découvrir ensemble le concept du "bit gluant", qui vient du concept Anglais de "sticky bit". Vous savez tous que les fichiers Unix comportent une liste de ce qu´on appelle "droits d´accès" qui vont par trois fois trois (écriture, lecture et exécution pour le propriétaire du fichier, le groupe du fichier et les autres). Et vous avez peut-être déjà eu l´idée de tenter, dans un dossier accessible en écriture à tout le monde, de rendre des fichiers impossibles à supprimer. C´est vrai qu´il n´y a rien de plus pénible dans un système basé sur la confiance entre vous et votre petite soeur que de vous apercevoir qu´elle a supprimé vos fichiers derrière votre dos !

Pourtant, parfois c´est utile de pouvoir partager ses documents, et de permettre à tous les utilisateurs d´ajouter des fichiers quelque part, mais pas aux uns de supprimer ceux des autres. Il existe une solution plus ou moins simple à cela, qui fonctionne sur tous les Unix. Et comme de par hasard c´est le sticky bit :)

Nous allons découvrir son action par une session à laquelle j´ajouterai des commentaires : nous sommes dans un répertoire nommé foo dans notre dossier utilisateur, sous le compte "poulet".

Créons un fichier de test, et attribuons le à un utilisateur nommé test1, ainsi qu´a un groupe également appelé test1 :

minipingouin:~/foo poulet$ touch fichiertest
minipingouin:~/foo poulet$ sudo chown test1:test1 fichiertest
minipingouin:~/foo poulet$ ls -l
total 0
-rw-r--r-- 1 test1 test1 0 Oct 22 19:45 fichiertest

Nous allons maintenant changer notre dossier (celui dans lequel nous sommes, désigné par un point) pour le faire appartenir au root et au groupe qui est traditionnellement le plus élevé, le groupe wheel. Nous allons également donner tous les droits à tout le monde sur ce dossier, pour que tout le monde puisse ajouter ses fichiers à l´intérieur. Ne faites pas attention au code de la troisième ligne, regardez juste son résultat.

minipingouin:~/foo poulet$ sudo chmod 777 .
minipingouin:~/foo poulet$ sudo chown root:wheel .
minipingouin:~/foo poulet$ ls -l .. | grep ´\ foo$´
drwxrwxrw 3 root wheel 102 Oct 22 19:59 foo

Le répertoire est effectivement accessible à tout le monde en lecture, écriture et exécution, tout en appartenant au groupe wheel et à l´utilisateur root. Hors la commande ´groups´ va nous confirmer que nous n´appartenons pas à ce groupe wheel :

minipingouin:~/foo poulet$ groups
poulet admin

Nous en arrivons enfin au pourquoi du cours : le bit gluant (j´adore ce nom). Il est caractérisé par la lettre ´t´, nous l´ajoutons comme ceci sur le répertoire dans lequel nous sommes, toujours désigné par un ´.´

minipingouin:~/foo poulet$ sudo chmod u+t .
minipingouin:~/foo poulet$ rm fichiertest
override rw-r--r-- test1/test1 for fichiertest? y
rm: fichiertest: Permission denied

Vous voyez que rm nous demande notre confirmation pour effectuer l´action, mais qu´il ne parvient quand même pas à détruire "fichiertest". A ce moment là, vous devez vous demander si cela n´aurait pas suffit de ne pas donner au fichier les droits d´accès en écriture pour tout le monde. Nous allons donc enlever le sticky bit du répertoire :

minipingouin:~/foo poulet$ sudo chmod u-t .
Password:
minipingouin:~/foo poulet$ rm fichiertest
override rw-r--r-- test1/test1 for fichiertest? y
minipingouin:~/foo poulet$ ls
minipingouin:~/foo poulet$

Et on constate que cette fois-ci le système ne nous a pas empêché de supprimer le fichier. Que se passe-t-il exactement ?

Tout simplement, Unix, lorsqu´il vérifie si un utilisateur est autorisé à modifier (ici, supprimer) un fichier, regarde d´abord les droits du fichier lui même. C´est ce qui fait que ´rm´ nous demande une confirmation. Mais si vous demandez à rm de *vraiment* détruire le fichier, Unix va le laisser faire en considérant que, comme vous vous trouvez dans un répertoire où vous avez le droit d´écrire, vous pouvez en changer le contenu. Le bit gluant sert donc à donner l´ordre à Unix d´empêcher de modifier le contenu du dossier par n´importe qui.

Retenez que ce bit se place sur le répertoire contenant, pas sur le fichier contenu. C´est comme ceci que fonctionne le répertoire Partagé (/Users/Shared)

Bigloo
Bigloo
Niveau 10
24 octobre 2005 à 22:57:05

Nous avons vu l´avant-veille d´aujourd´hui (mais vous ne lisiez déjà pas) comment faire un répertoire partagé qui empêchait à n´importe qui de supprimer n´importe quoi. Aujourd´hui nous allons faire quelque chose de beaucoup plus constructif : nous allons permettre à n´importe qui de supprimer une partie du n´importe quoi (et les plus courageux d´entre vous pourrons même chercher à faire un contrôle sur le n´importe qui) sans pour autant lui permettre de supprimer le reste. Sisi, ça a une utilité : par exemple, vous voulez bien que votre soeur supprime des fichiers déposés par vous-même dans le dossier Partagé juste à l´occasion d´un coup d´oeil, mais il est hors de question qu´elle supprime le-truc-dont-tout-le-monde-a-besoin. De plus, ça va permettre aux personnes qui n´ont pas de droits d´administration de supprimer des fichiers protégés sans pour autant devoir passer par un compte admin, ou pire, par le Terminal.

Nous allons analyser le problème de façon plus unixienne : nous sommes en présence de fichiers appartenant à quelqu´un d´autre que nous, sur lesquels nous n´avons pas droit de suppression, et nous avons donc besoin de droits roots pour les supprimer, sans pour autant pouvoir appeler ces droits sur le moment. Nous avons vu la dernière fois le bit gluant, voyons aujourd´hui le bit S-UID. C´est nettement moins joli comme nom mais après tout, c´est comme l´autre, on va l´utiliser une fois puis basta.

Notre projet final est de faire un dropplet contenant un script shell (que vous pourrez après remplacer) qui détruira ce que vous ferez glisser dessus.

Partie 1 : Un bref passage par le concept de droits d´éxecutions

Vous commencez à le savoir mieux que personne, Unix est un organisme complexe, le genre dans lequel il y´a des règles sur les règles :)

Nous avons vu que les fichiers avaient des droits, qui correspondaient aux autorisations des utilisateurs sur ces fichiers. Mais nous n´avons pas vu grand chose sur les utilisateurs eux-mêmes... Voici un très très bref aperçu de ce qui se passe quand un utilisateur lance une commande ou un programme.

Le système commence par regarder le droit de l´utilisateur de lancer la commande. Il faut que cet utilisateur ai droit d´executer le fichier qui désigne la commande, ce qui se voit par un "x" lorsqu´on utilise la commande ls avec l´option -l :

minipingouin:~ poulet$ ls -l /bin/ls
-r-xr-xr-x 1 root wheel 32460 Mar 21 2005 /bin/ls

Après cela, le système va lancer un nouveau processus (c´est à dire une nouvelle tâche) avec, dans ces conditions là (nous verrons après comment changer ces conditions) ce qu´on appelle un EUID rattaché au processus. C´est l´Effective User IDentifier (ne pas confondre le E avec Execution) qui décide des droits du processus. Par exemple un programme qui voudrait accèder au fichier /var/log/secure.log DOIT être lancé avec un EUID correspondant au root. Voici ce qui se passe pour un utilisateur lambda

minipingouin:~ lambda$ head /var/log/secure.log
head: /var/log/secure.log: Permission denied

Simplement parce que
minipingouin:~ lambda$ ls -l /var/log/secure.log
-rw------- 1 root admin 338113 Oct 24 12:03 /var/log/secure.log

le fichier n´est pas accessible à n´importe qui.

Nous allons faire un programme en C (si vous ne le comprenez pas, c´est pas grave) qui vérifie ce qu´on appelle l´EUID et qui essaye de faire la commande au dessus. Le voici :

  1. include <stdio.h>
  2. include <unistd.h>

main()
{
printf("Execution par %s\n", geteuid()==0 ? "le root" : "quelqu´un d´autre que le root");
system("head /var/log/secure.log");
}

Il fait appelle à la fonction geteuid() qui renvoie l´EUID du processus. Rappelez vous que le root a un UID de 0. Le test

geteuid()==0 ? "le root" : "quelqu´un d´autre que le root"

est donc une expression un peu compliquée (très célèbre en C) qui sert à afficher avec printf (ici) si le processus est lancé en root ou non.

Compilez le programme et testez le :

minipingouin:~ poulet$ cc -o foo.prog foo.c
minipingouin:~ poulet$ ./foo.prog
Execution par quelqu´un d´autre que le root
head: /var/log/secure.log: Permission denied
minipingouin:~ poulet$

C´était prévisible. Nous allons maintenant le lancer en root :

minipingouin:~ poulet$ sudo ./foo.prog
Password:
Execution par le root
... suivi du résultat de la commande head

C´est donc que l´EUID dépend de l´utilisateur. Si nous voulions utiliser un EUID de zéro depuis un utilisateur quelconque, il nous faudrait une astuce pour cela. Et nous verrons tout à l´heure les S-UID :)

Partie 2 : Faire d´un script shell (ou autre) proprement génial un dropplet.

Les plus dégourdis d´entre vous auront sans doute remarqué que le Finder considère mal leurs programmes pour la ligne de commande : il n´est pas possible par exemple de faire glisser un fichier sur un de ceux-là pour que le programme se lance avec le fichier comme argument. La solution facile à trouver serait de faire une nouvelle application dropplet en AppleScript ou Objective-C pour qu´elle lance notre premier programme, ce qui serait un peu long.

Heureusement, quelqu´un a pensé aux bricoleurs que nous sommes, et a écrit un programme fantastique qui transforme n´importe lequel de vos scripts en dropplet : DropScript http://www.wsanchez.net/software/

Il place votre script dans un paquet dont vous devriez connaître certains fichiers (/ représente la racine du paquet)
/Contents/MacOS/Dropnomduscript
/Contents/Ressources/script

Le premier fichier est à modifier lorsque vous changez le nom du paquet (les deux noms doivent coïncider). C´est l´executable qui vient en premier, et qui APRES appelle votre script. Le second est justemment ce script. Il existe bien sûr d´autres fichiers qui peuvent être intéressants.

Maintenant que nous savons comment faire un dropplet à partir d´un script, il ne nous manque que... le script. Pour commencer, un simple "jesupprimetoutcequimetouche" suffira :

  1. !/bin/sh

rm -rf $*

La première ligne est nécessaire pour qu´on puisse lancer le script depuis DropScript. La deuxième est un bon vieux rm -rf qui remplacera le $* par tous les arguments que lui aura passé Dropscript au lancement (c´est à dire tous les fichiers que vous aurez fait glisser).

Faites glisser ce script sur DropScript... paf. Vous pouvez tester ce que vous voulez dessus, mais sachez QUE CA SERA PERDU A JAMAIS (sans vouloir vous faire paniquer). Si vous voulez modifier le script (par ce que vous voulez, même d´un autre langage), vous pouvez l´ouvrir directement dans le paquet, mais parfois le Finder refuse d´ouvrir les applications qui ont au moins un de leurs fichiers ouverts. N´oubliez donc pas de tout refermer. N´oubliez pas non plus la première ligne qui indique le chemin de l´interpréteur.

Notre dropplet de suppression fonctionne donc. Mais naturellement, il subit les contraintes de la partie I, et ne peut-être lancé pour supprimer un fichier normalement interdit en écriture que depuis un compte root. Sauf que...

Partie 3 : Changer le EUID d´un programme à son lancement sans entrer de mot de passe ni en laisser un en clair dans le programme, ce qui ne serait d´ailleurs pas très sécurisé

Nous allons donc voir le bit ´s´ qui permet de lancer un programme sous le nom de son propriétaire. Reprenons l´exemple de la partie 3.

minipingouin:~ poulet$ ./foo.prog
Execution par quelqu´un d´autre que le root
head: /var/log/secure.log: Permission denied
minipingouin:~ poulet$ sudo ./foo.prog
Password:
Execution par le root
... suivi du résultat de la commande head

Nous pouvons essayer de changer le propriétaire du fichier

minipingouin:~ poulet$ sudo chown root:wheel foo.prog
minipingouin:~ poulet$ ls -l foo.prog
-rwxr-xr-x 1 root wheel 17268 Oct 24 12:51 foo.prog
minipingouin:~ poulet$ ./foo.prog
Execution par quelqu´un d´autre que le root
head: /var/log/secure.log: Permission denied
minipingouin:~ poulet$

Mais ça ne fonctionne pas vraiment mieux (ce qui est rassurant, pensez au nombre de programmes qui appartiennent au compte root dans votre système et qui seraient donc lancés en root si les choses fonctionnaient comme ça). Et voilà l´astuce :

minipingouin:~ poulet$ sudo chmod +s foo.prog
minipingouin:~ poulet$ ls -l foo.prog
-rwsr-sr-x 1 root wheel 17268 Oct 24 12:51 foo.prog

Remarquez que le bit x a laissé place à un s. Lançons maintenant notre mystérieux programme...

minipingouin:~ poulet$ ./foo.prog
Execution par le root
...et nous avons bien le résultat de la commande head.

Tout fonctionne parfaitement. Etape suivante...

Partie 4 : Appliquer notre savoir au dropplet

Commencez par placer votre dropplet dans le répertoire Partagé. Actuellement il est capable de supprimer tout ce qui vous appartient, ce qui n´est pas encore assez vaste comme champ d´application. C´est pourquoi nous allons le SUIDiser.

Commencez par aller dans le répertoire MacOS du paquet comme je le fais ici :
minipingouin:/Users/Shared poulet$ cd /Users/Shared/Dropdestruit.app/Contents/MacOS/

minipingouin:/Users/Shared/Dropdestruit.app/Conten
ts/MacOS poulet$ ls -l
total 48
-rwxr-xr-x 1 poulet poulet 22568 Aug 11 2002 Dropdestruit

Puis changeons le propriétaire, le groupe et plaçons notre S-UID

minipingouin:/Users/Shared/Dropdestruit.app/Conten
ts/MacOS poulet$ sudo chown root:wheel Dropdestruit
Password:

minipingouin:/Users/Shared/Dropdestruit.app/Conten
ts/MacOS poulet$ sudo chmod +s Dropdestruit

Vous pouvez tester, c´est redoutable.

Partie 5 : Limiter l´action !

Notre script présente un gros gros gros défaut (même plusieurs mais on va y´aller par ordre) : nous n´avons pas changé ses droits... ce qui fait qu´un utilisateur averti peut en profiter pour le modifier pour qu´il soit lancé en root... et je vous laisse deviner la suite. Réglez donc ceci par vous mêmes.

Maintenant, il en présente d´autres. Par exemple, il nous permet de supprimer n´importe quoi en le glissant-déposant dessus... ce qui n´est pas chouette, ça permet à n´importe qui de supprimer n´importe quoi dans TOUT le système. Voilà le même script en plus sécurisé

  1. !/bin/sh

tmp=`echo "$1" | grep -v "\.\." | grep "^/Users/Shared" `

if [ -n "$tmp" ]
then
rm -rf "$tmp"
fi

Il s´assure de trouver /Users/Shared dans le chemin du fichier, et surtout de ne pas trouver d´astuce comme un /Users/Shared/../qqchose qui permettrit d´attaquer un qqchose placé ailleurs que dans le répertoire Partagé (car les .. remontent dans le répertoire parent, je précise au cas où :) )

Je vous conseille fortement de ne PAS faire vos scripts en shell, car c´est vraiment un langage pénible. Préférez Python ou PHP, comme ici (écrit par Panther) :

  1. ! /usr/bin/php

<?php

// On est bien dans /Users/Shared?
if ( ereg("^/Users/Shared",$argv[1]) == 0 || ereg("\.\.",$argv[1])) exit("Heho ca va pas la tete t´es pas du tout la ou il faut.\n");

// Fonction de suppression d´un dossier plein
function rm_recursif($dossiern)
{
$dossier = dir($dossiern);
while ($item = $dossier->read())
{
if (is_dir($dossiern."/".$item) && $item != "." && $item != "..") rm_recursif($dossiern."/".$item);
else if ($item != "." && $item != "..") {
unlink($dossiern."/".$item);
echo $dossiern."/".$item."... Supprimé\n";
}
}
rmdir($dossiern);
echo "$dossiern... Supprimé\n";
}

// Cas d´un dossier
if(file_exists($argv[1]) && is_dir($argv[1]))
rm_recursif($argv[1]);

// Cas d´un fichier
else if (file_exists($argv[1]))
{
unlink($argv[1]);
echo $argv[1]."... Supprimé\n";
}

// Cas fichier non trouvé
else
echo "Fichier non trouve\n";

?>

Partie 6 : Où on s´aperçoit que les SUID sont utiles, et que vous avez tord de ne pas m´écouter

Vous avez dans votre système quelques programmes qui sont déjà SUID comme ps

minipingouin:~/Documents poulet$ ls -l /bin/ps
-rwsr-xr-x 1 root wheel 31932 Mar 21 2005 /bin/ps

car sinon, comment pourrait-il lister les processus de chacuns ?

Nous allons faire un autre exemple. Ecrivez

  1. !/bin/sh

shutdown -h now

dans un fichier nommé "eteindre". Puis :

minipingouin:~ poulet$ sudo chown root:wheel eteindre
minipingouin:~ poulet$ sudo mv eteindre /bin/eteindre
minipingouin:~ poulet$ sudo chmod +s /bin/eteindre

Normalement, si vous faites ´eteindre´, votre Mac s´éteint directement. Ne le faites pas : ça n´est pas une façon très propre de l´éteindre, et en plus ça ne marchera pas (sauf peut être sous des systèmes plus âgés). Pourquoi ?

Parce que MacOS X est bien fait : il sait que ça n´est pas une bonne idée de SUIDiser les scripts, qui ne sont que du texte et qui risquent d´être modifiés par des pirates (me demandez pas comment j´ai pas retenu l´exemple du site sur lequel j´ai vu ça). Dans le cas du Dropscript, cela a fonctionné uniquement parce que c´était un programme compilé qui lançait le script.

Il y´a pour nous deux possibilités :

Ou bien nous sommes complètement fous et nous modifions une option du kernel avec la commande

minipingouin:~ poulet$ sudo sysctl -w kern.sugid_scripts=1
kern.sugid_scripts: 0 -> 1

Ou bien nous faisons comme dans le cas du Dropscript, nous demandons à un programme compilé de lancer notre script. Un simple system("eteindre"); dans un programme lancé en C en SUID root et ça fonctionnera.

La somme des connaissances que vous venez d´emmaganiser à la suite de votre lecture est considérable.

Cap-mari
Cap-mari
Niveau 10
10 juillet 2007 à 17:53:21

J´ai supprimer ce p**** de terminal sans le faire exprès et depuis j´ai reinstallé toutes les applications présentes sur le DVD d´installation.
Mais je ne le trouve pas dans Application et Utilitaire
Quelqu´un pourrait m´aider svp ?

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment