2 votes

Comment puis-je script le disque de démarrage dans MacOS Catalina sans désactiver SIP ?

Je suis sur Catalina 10.15.6.

Auparavant, vous pouviez écrire des scripts shell scripts qui définissaient le volume de démarrage et redémarraient le Mac, soit en utilisant la fonction bless --mount X --setBoot ou en utilisant systemsetup -setstartupdisk mais aucune de ces commandes ne semble fonctionner maintenant lorsque la protection de l'intégrité du système est activée.

Il doit y avoir un peu de Il n'y a pas de moyen d'automatiser cela, puisque l'application Préférences Système est capable de changer votre disque de démarrage sans que SIP soit désactivé, il suffit de fournir un mot de passe administrateur. Quel mécanisme le volet des préférences utilise-t-il pour définir le disque de démarrage maintenant ? Peut-on l'invoquer dans un shell script ?

3voto

Wowfunhappy Points 6021

L'application Préférences Système est en mesure de modifier le disque de démarrage parce que l'application est signée avec des droits spéciaux, réservés à Apple, qui lui permettent de contourner la protection de l'intégrité du système (SIP). Afin d'accorder ces droits à votre propre application, vous devriez désactiver l'AMFI, ce qui vous obligerait à désactiver (attendez...) SIP !

De nombreuses applications Apple contiennent ces types de droits. Pensez-y : si tous les logiciels Apple étaient confinés par SIP, comment pourriez-vous installer des mises à jour qui modifient les fichiers système ?

Cela indique également une solution de contournement possible. Puisque les Préférences Système sont autorisées à modifier le disque de démarrage (en contournant une partie de SIP), vous pourriez écrire un script qui dit aux Préférences Système de tout faire pour vous. Je l'ai fait - il y a plusieurs années, j'ai écrit et utilisé l'Applescript ci-dessous pour redémarrer rapidement dans Bootcamp. Comme il utilise des scripts d'interface utilisateur, il peut nécessiter des ajustements pour fonctionner sur les dernières versions de MacOS, mais il devrait servir de point de départ.

tell application "System Events"
    try
        tell application "System Preferences"
            set current pane to pane id "com.apple.preference.startupdisk"
            activate
        end tell
        tell application process "System Preferences"
            delay 0.3
            tell window "Startup Disk"
                set lockFound to false
                repeat with x from 1 to number of buttons
                    if lockFound is false then
                        if title of button x is "Click the lock to make changes." then
                            click button x
                            set lockFound to true
                            repeat while title of button x is "Authenticating..."
                                delay 1
                            end repeat
                        else if title of button x is "Click the lock to prevent further changes." then
                            set lockFound to true
                        end if
                    end if
                end repeat
                click radio button "BOOTCAMP" of radio group 1 of scroll area 1 of group 1 of splitter group 1
                delay 0.4
                click button "Restart…"
                delay 0.3
                click button "Restart" of sheet 1
                return true
            end tell
        end tell
    on error
        delay 0.5
        tell application "System Preferences"
            if current pane is pane id "com.apple.preference.startupdisk" then quit
        end tell
        return false
    end try
end tell

1voto

David Anderson Points 30783

Les concepteurs de MacOS choisissent les commandes qui sont contraintes par SIP. Pour être plus précis, certaines commandes ont la possibilité de contourner les contraintes de SIP. Le site bless n'est pas une des commandes contenues dans le SIP. Pour utiliser la commande afin de définir la valeur par défaut du démarrage, il faudrait désactiver au moins une partie de SIP.

Une alternative serait d'utiliser un gestionnaire de démarrage qui peut être configuré depuis un script ou une application MacOS. Un exemple d'un tel gestionnaire de démarrage est rEFInd . S'il est installé sur une partition EFI, un mot de passe sera nécessaire pour monter la partition. Si elle est installée sur une partition FAT ou ExFAT, aucun mot de passe n'est requis, mais elle est moins sécurisée. Le site default_selection peut être utilisé pour choisir le système d'exploitation par défaut à démarrer. En général, ce jeton et les paramètres sont stockés dans un fichier de votre choix. Le nom de ce fichier est ensuite donné comme paramètre à la fonction include stocké dans le refind.conf fichier.

1voto

ratojakuf Points 111

Le SIP a été le premier problème que j'ai rencontré à Big Sur. L'éteindre semble être une mauvaise idée. J'ai donc essayé quelque chose comme @Wowfunhappy l'a suggéré mais avec une mise à jour pour s'adapter à l'interface du nouveau système d'exploitation et aussi ajouter quelques fonctions supplémentaires. Le deuxième problème est que les éléments de la liste des volumes cibles n'ont pas d'actions. Ce qui rend impossible de cliquer dessus via les fonctions click ou "click at", peut-être à cause de certaines nouvelles protections supplémentaires sur Big Sur. Cliquer avec AST et d'autres scripts ne fonctionne pas non plus à cause des nouvelles restrictions de MacOS. La seule façon que j'ai trouvée est d'utiliser Python click(mais cela conduit à un léger retard pendant que scripts sélectionne le volume cible).

Voici donc une commutation entièrement automatisée :

property targetVolume : "BOOTCAMP" # find name of required volume inside System Preference > Startup Disk
property passwordValue : "yourSystemPassword" # Can be empty

tell application "System Events"
    tell application "System Preferences"
        set current pane to pane id "com.apple.preference.startupdisk"
        activate
    end tell
    tell application process "System Preferences"
        tell window "Startup Disk"
            set volumePosition to {0, 0}
            set lockFound to false

            # Check if auth required
            set authButtonText to "Click the lock to make changes."
            if exists button authButtonText then
                click button authButtonText

                # Wait for auth modal
                set unlockButtonText to "Unlock"
                repeat
                    if (exists sheet 1) and (exists button unlockButtonText of sheet 1) then exit repeat
                end repeat

                # Autofill password if setted
                if passwordValue is not equal to "" then
                    set value of text field 1 of sheet 1 to passwordValue
                    click button unlockButtonText of sheet 1
                end if

                # Wait for auth success
                repeat
                    if exists button "Click the lock to prevent further changes." then exit repeat
                end repeat
            end if

            # Wait until loading volumes list
            repeat
                if exists group 1 of list 1 of scroll area 1 then exit repeat
            end repeat

            # Click on target volume (posible a slight delay because of shell script executing)
            repeat with m in (UI element of list 1 of scroll area 1)
                if (value of first static text of m = targetVolume) then
                    tell static text targetVolume of m
                        set volumePosition to position
                    end tell
                end if
            end repeat
            set volumePositionX to item 1 of volumePosition
            set volumePositionY to item 2 of volumePosition
            my customClick(volumePositionX, volumePositionY)

            click button "Restart…"

            # Wait for restart modal appears
            repeat
                if (exists sheet 1) and (exists value of first static text of sheet 1) then exit repeat
            end repeat

            click button "Restart" of sheet 1
        end tell
    end tell
end tell

# shell script to make click work on target volume
on customClick(x, y)
    do shell script " 

/usr/bin/python <<END

import sys

import time

from Quartz.CoreGraphics import * 

def mouseEvent(type, posx, posy):

          theEvent = CGEventCreateMouseEvent(None, type, (posx,posy), kCGMouseButtonLeft)

          CGEventPost(kCGHIDEventTap, theEvent)

def mousemove(posx,posy):

          mouseEvent(kCGEventMouseMoved, posx,posy);

def mouseclick(posx,posy):

          mouseEvent(kCGEventLeftMouseDown, posx,posy);

          mouseEvent(kCGEventLeftMouseUp, posx,posy);

ourEvent = CGEventCreate(None); 

currentpos=CGEventGetLocation(ourEvent);             # Save current mouse position

mouseclick(" & x & "," & y & ");

mousemove(int(currentpos.x),int(currentpos.y));      # Restore mouse position

END"
end customClick

on simpleEncryption(_str)
    set x to id of _str
    repeat with c in x
        set contents of c to c + 100
    end repeat
    return string id x
end simpleEncryption

on simpleDecryption(_str)
    set x to id of _str
    repeat with c in x
        set contents of c to c - 100
    end repeat
    return string id x
end simpleDecryption

Vous devez juste changer deux propriétés Volume cible y Valeur du mot de passe . Le mot de passe peut être vide et dans ce cas, vous pouvez le fournir manuellement. Ensuite, il suffit de copier ce script, de le coller dans l'éditeur script et de l'exporter via Fichier -> Exportation -> format de fichier - Application, sélectionnez Exécuter uniquement -> Enregistrer. Vous pouvez faire le même processus pour tous les systèmes que vous avez, par exemple Big Sur 1, Big Sur 2, Bootcamp.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X