Je peux exécuter ls avec succès, mais si je lance ls -l sur le même dossier, j'obtiens "Operation not permitted".
Différence entre ls
et ls -l
ls
affiche le nom des fichiers/répertoires contenus dans un répertoire, alors que ls -l
affiche beaucoup plus d'informations (extrait de man ls
) :
If the -l option is given, the following information is displayed for each
file: file mode, number of links, owner name, group name, number of bytes
in the file, abbreviated month, day-of-month file was last modified, hour
file last modified, minute file last modified, and the pathname.
Normalement, l'accès en lecture au répertoire parent devrait suffire pour obtenir cette information, mais dans ce cas particulier (SIP activé et datavault
activé, voir ci-dessous), ce n'est pas le cas.
Par exemple, pour obtenir le nombre de liens, vous devez connaître le numéro d'inode. Vous pouvez obtenir cette information avec ls -i
et vous verrez qu'il échoue pour un certain nombre de fichiers et de répertoires (et par conséquent ls -l
échouera également pour ces fichiers/répertoires) :
ls -i /private/var/folders/51/y66nwk4x1b700xgy1fs5d_9w0000gq/0/
ls: com.apple.LaunchServices.dv: Operation not permitted
ls: com.apple.SharedWebCredentials: Operation not permitted
ls: com.apple.lockoutagent: Operation not permitted
ls: com.apple.nsurlsessiond: Operation not permitted
ls: dmd: Operation not permitted
18693497 com.apple.ScreenTimeAgent 18701711 com.apple.corespeechd 18688786 com.apple.icloud.searchpartyd 18687284 com.apple.progressd
18693950 com.apple.Spotlight 18687828 com.apple.dmd 18687147 com.apple.notificationcenter 18691540 com.apple.routined
18688254 com.apple.bird 18702008 com.apple.dock.launchpad 11150084 com.apple.pluginkit
D'un autre côté, ls
affiche simplement les noms de fichiers, et cette information peut être récupérée pour tous les fichiers.
Pourquoi est-ce que sudo ls -l
travail ?
sudo
vous permet d'exécuter des commandes en tant que root
:
$ sudo whoami
root
mais root
n'est plus un utilisateur tout-puissant : depuis OS X 10.11 "El Capitan", ses pouvoirs sont limités par Protection de l'intégrité du système (SIP) :
La protection de l'intégrité du système restreint le compte de l'utilisateur root et limite les actions que ce dernier peut effectuer sur les parties protégées du système d'exploitation Mac.
Avant la protection de l'intégrité du système, l'utilisateur racine n'avait aucune restriction d'autorisation, il pouvait donc accéder à n'importe quel dossier système ou application de votre Mac. Un logiciel obtenait un accès de niveau Racine lorsque vous entriez votre nom d'administrateur et votre mot de passe pour installer le logiciel. Cela permettait au logiciel de modifier ou d'écraser n'importe quel fichier système ou application.
La protection de l'intégrité du système comprend protection pour ces parties du système :
donc /var
est l'un des dossiers protégés que root
n'a plus un accès illimité.
Mais ce n'est pas tout : la désactivation de SIP rend ces fichiers accessibles à root
et au propriétaire. Tous les fichiers qui n'ont pas pu être lus ont l'attribut étendu com.apple.rootless
ce qui les marque comme étant protégé par SIP mais ils ont aussi le datavault
activé, par exemple :
ls -ledD@ com.apple.LaunchServices.dv
drwx------@ 4 jaume staff datavault 128 Jan 17 10:35 com.apple.LaunchServices.dv
com.apple.rootless 27
ce qui les rend illisible sauf pour les applications ayant le droit correspondant (lorsque le SIP est désactivé, l'accès est à nouveau régi par le mode et la propriété, comme dans un système de fichiers traditionnel de type UNIX).
J'ai trouvé ça parce que Timemachine ne peut pas sauvegarder ces fichiers.
/private/var/folders
stocke des données transitoires et son contenu n'est pas sauvegardé par Time Machine.