Après la mise à niveau vers Mojave, ma sauvegarde basée sur rsync script exécutée via un agent de lancement dans ~/Bibliothèque/LaunchAgents, ne pouvait plus lire certains répertoires dans ~/Bibliothèque.
Réponses
Trop de publicités?J'ai passé quelques semaines à essayer de résoudre ce problème. Je reconnais que la réponse actuellement acceptée n'est pas vraiment une solution - ce n'est pas beaucoup mieux que de désactiver complètement le SIP.
Ma solution est une solution de contournement totalement bidon, mais ne nécessite pas de liste blanche. bash
entièrement. Mise à jour : Une solution un peu moins compliquée est proposée ci-dessous.
Mise à jour 20190226 : Comme détaillé dans le problème Restic lié ci-dessous, cela semble avoir cessé de fonctionner. Les binaires originaux que j'ai créés avec cette méthode continuent de fonctionner sans erreur pour une raison étrange, mais je ne peux pas donner accès aux nouveaux binaires directement en utilisant cette méthode.
Vue d'ensemble
- Empaqueter une application MacOS standard qui exécute un script (un script bash dans mon cas, qui à son tour configure un environnement et exécute un binaire séparé qui nécessite FDA).
- Ajouter cette application à la FDA
- Exécutez l'application en ouvrant le fichier .app (soit en double-cliquant sur l'interface graphique, soit en cliquant sur l'icône de l'application).
open /path/to/MyApp.app
mais pas en utilisant directement l'exécutable stocké dans par exempleMyApp.app/Contents/Resources/
)
Pour l'étape 1, vous pouvez facilement empaqueter votre script comme une application en utilisant des outils intégrés à MacOS tels que Automator.app ou script Editor, ou encore L'ornithorynque fonctionne également.
Un exemple de contenu d'une telle application pourrait être un simple AppleScript (dans l'éditeur script) tel que :
on run
do shell script "/usr/local/bin/bash /path/to/myscript.sh"
end run
À partir de l'éditeur de script, utilisez la liste déroulante du menu d'enregistrement pour enregistrer comme une application, puis CLOSE script EDITOR .
Ajouter cette application à Full Disk Access par System Preferences
-> Security & Privacy
.
NB : Si vous n'avez pas sauvegardé et fermé le script Editor avant de l'ajouter à FDA comme indiqué, il semble qu'une sorte de processus invisible (sauvegardes automatiques en arrière-plan ?) change quelque chose (une sorte d'horodatage ou de hachage ?) qui est requis pour l'accès complet au disque, ce qui peut provoquer des erreurs intermittentes qui ont été un casse-tête majeur à comprendre. Donc, si vous n'avez pas fait cela, supprimez votre application de FDA, sauvegardez et fermez script Editor, puis ajoutez de nouveau à FDA.
Pour votre agent de lancement, utilisez quelque chose comme :
<string>/usr/bin/open</string>
<string>/path/to/MyApp.app</string>
Accès à la racine
Si votre script de sauvegarde a besoin d'un accès Root (par exemple pour sauvegarder des fichiers 0600 appartenant à Root), vous allez devoir faire face à une autre série de contournements, puisque /usr/bin/open
ne semble pas pouvoir exécuter quoi que ce soit en tant que Root (même si vous spécifiez l'option UserName
la clé dans un Root-owned /Library/LaunchDaemons/
plist. (Je serais heureux d'ouvrir cette question en tant que question distincte si nécessaire, car je pense que la solution de contournement ci-dessous laisse beaucoup à désirer).
Une option pour cela est d'ajouter with administrator privileges
dans votre AppleScript, mais cela nécessite de taper manuellement votre mot de passe, ce qui va à l'encontre de l'objectif de la sauvegarde automatique. Ma solution actuelle est de :
-
sudo visudo
et donner à mon utilisateur non privilégié la possibilité d'exécuter mon script de sauvegarde en tant que sudo avec NOPASSWD : (je spécifie également le hash du script pour espérer améliorer la sécurité, par ex.myuser ALL=(ALL) NOPASSWD: sha256:hashgoeshere /path/to/myscript.sh
) sudo chown root myscript.sh
-
sudo chmod 0740 myscript.sh
(4 pour qu'il puisse encore être ajouté à VCS) - Changez l'AppleScript en
do shell script "sudo -n /path/to/myscript.sh"
et réenregistrer sous le nom de MyApp.app - Ajouter MyApp.app à la FDA
- Changer mon launchd script pour ouvrir /path/to/MyApp.app
- Rechargez launchd script avec launchctl et testez pour vous assurer que cela semble fonctionner.
Autres lectures / détails :
- https://github.com/restic/restic/issues/2051
- https://n8henrie.com/2018/11/how-to-give-full-disk-access-to-a-binary-in-MacOS-mojave/
UPDATE :
Après quelques tests préliminaires, il semble qu'une solution de contournement un peu moins pirate consiste à compiler un binaire (en utilisant un langage compilé) qui appelle votre script bash. Ajoutez ce binaire à FDA et cela semble fonctionner. Ajouter à la Root-owned /Library/LaunchDaemons
plist, et vous avez un moyen de l'appeler à partir de root
sans toutes les folies ci-dessus.
Exemple script en Go :
// Runrestic provides a binary to run my restic backup script in MacOS Mojave with Full Disk Access
package main
import (
"log"
"os"
"os/exec"
"path/filepath"
)
func main() {
ex, err := os.Executable()
if err != nil {
log.Fatal(err)
}
dir := filepath.Dir(ex)
script := filepath.Join(dir, "restic-backup.sh")
cmd := exec.Command("/usr/local/bin/bash", script)
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
}
Par sécurité, je sudo chown root
y sudo chmod 0700
le binaire résultant avant de l'ajouter à Full Disk Access
(bien qu'il soit admis qu'un attaquant pourrait simplement changer le script bash script que cela appelle s'il était laissé sans protection).
La réponse actuellement acceptée est un peu difficile à suivre avec toutes ses mises à jour. Voici un bref résumé de ce qui fonctionne et ne fonctionne pas actuellement, ainsi qu'un nouveau conseil.
L'ajout de scripts ou de binaires à la liste "Full Disk Access" ne fonctionne plus. La seule chose qui fonctionne est d'ajouter une application MacOS réelle. Comme Channing le mentionne, Automator.app, scripts Editor, ou Platypus peuvent être utilisés pour en créer une.
Conseil : la liste blanche s'applique à tout script ou binaire dans le répertoire de l'application. Ainsi, vous n'avez pas besoin de lancer l'application directement. En fait, l'app elle-même n'est absolument pas pertinente -- elle agit simplement comme un conteneur pour la liste blanche. Vous pouvez copier votre script dans une application arbitraire, mettre cette application sur la liste blanche, puis exécuter votre script. La seule réserve est que vous devez supprimer et réinscrire l'app sur la liste blanche chaque fois que vous modifiez votre script ou le binaire qu'il contient.
J'ai résolu ce problème de la manière suivante :
Autoriser Bash à avoir un accès complet au disque
- Ouvrir les préférences
- Allez dans Sécurité et préférences
- Sélectionnez Full Disk Access dans la liste à gauche.
- Cliquez sur le verrou pour effectuer des modifications
- Cliquez sur le bouton + dans la liste de droite.
- Allez à la racine de votre disque dur
- Appuyez sur CMD+Shift+. pour afficher tous les éléments cachés.
- Sélectionnez /bin/bash
- Quitter les préférences
- Redémarrez le Mac (je ne suis pas sûr que ce soit vraiment nécessaire).
Exécutez correctement votre script.
L'erreur que j'ai faite est que l'agent de lancement a exécuté le script comme ceci :
<key>ProgramArguments</key>
<array>
<string>/Users/channing/bin/backup.sh</string>
</array>
Faites plutôt ceci
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/channing/bin/backup.sh</string>
</array>
Redémarrez votre agent :
launchctl unload ~/Library/LaunchAgents/backup.plist
launchctl load ~/Library/LaunchAgents/backup.plist
Réjouissez-vous.
Une nouvelle façon d'aborder ce problème : LaunchControl est maintenant livré avec une aide appelée fdautil
que vous pouvez mettre sur une liste blanche, et ensuite exécuter des commandes en utilisant fdautil exec
. Il n'autorisera que les commandes que vous avez mises sur liste blanche via LaunchControl ou fdautil set
.
Vous trouverez des informations à ce sujet sur le site suivant https://www.soma-zone.com/LaunchControl/FAQ.html et plus de détails dans la fenêtre d'aide de l'application.
J'ai eu le même problème sur MacOS Catalina en essayant de programmer des sauvegardes de Borg.
J'ai créé une application en utilisant "script Editor" qui exécute /usr/local/bin/borg-backup.sh
en utilisant zsh
.
do shell script "zsh /usr/local/bin/borg-backup.sh"
J'ai ensuite exporté l'application vers /Applications/borg-backup.app
en cliquant sur "Fichier" puis "Exporter..." en choisissant "Application" comme "Format de fichier".
Enfin, j'ai mis à jour ~/Library/LaunchAgents/local.borg-backup.plist
.
<key>ProgramArguments</key>
<array>
<string>open</string>
<string>/Applications/borg-backup.app</string>
</array>
La première fois que l'agent de lancement a été exécuté, une invite m'a demandé d'autoriser borg-backup.app
l'accès à ~/Documents
.
- Réponses précédentes
- Plus de réponses