2 votos

¿Cómo puedo script el disco de arranque en macOS Catalina sin desactivar SIP?

Estoy en Catalina 10.15.6.

Anteriormente, se podían escribir shell scripts que establecían el volumen de arranque y reiniciaban el Mac, bien utilizando bless --mount X --setBoot o utilizando systemsetup -setstartupdisk pero ninguno de estos comandos parece funcionar ahora que está activada la protección de integridad del sistema.

Debe haber algunos forma de automatizar esto, ya que la aplicación Preferencias del Sistema es capaz de cambiar el disco de arranque sin que SIP esté deshabilitado, sólo necesitas proporcionar una contraseña de administrador. ¿Qué mecanismo utiliza ahora el panel de preferencias para establecer el disco de arranque? ¿Podemos invocarlo en un shell script?

0 votos

¿No está el disco de arranque almacenado en nvram? ¿Puedes modificarlo con el comando nvram?

0 votos

@benwiggy El estado de SIP también se almacena en la nvram. :P Cuando SIP está activado, no puedes cambiar los valores protegidos de la nvram.

3voto

Wowfunhappy Puntos 33

La aplicación Preferencias del Sistema puede cambiar el disco de inicio porque está firmada con derechos especiales exclusivos de Apple que le permiten eludir la Protección de Integridad del Sistema (SIP). Para conceder esos derechos a tu propia aplicación, necesitarías desactivar AMFI, lo que a su vez requeriría (espera...) ¡desactivar SIP!

Muchas aplicaciones de Apple contienen este tipo de derechos. Piénsalo: si todo el software de Apple estuviera limitado por SIP, ¿cómo podrías instalar actualizaciones que modifican los archivos del sistema?

Esto también apunta a una posible solución. Como Preferencias del Sistema puede cambiar el disco de inicio (saltándose una parte de SIP), puede escribir un script que le diga a Preferencias del Sistema que lo haga todo por usted. Yo he hecho esto - hace muchos años, escribí y usé el siguiente Applescript para reiniciar rápidamente en Bootcamp. Debido a que utiliza secuencias de comandos de interfaz de usuario, puede necesitar ajustes para funcionar en las últimas versiones de MacOS, pero debería funcionar como punto de partida.

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 Puntos 2189

Los diseñadores MacOS elegir qué comandos que están restringidos por SIP. Para ser más precisos, a ciertos comandos se les da la capacidad de eludir las restricciones de SIP. El bless no es uno de los comandos que contiene SIP. Para utilizar el comando para establecer el valor predeterminado de arranque sería necesario desactivar al menos parte de SIP.

Una alternativa sería utilizar un gestor de arranque que se puede configurar desde un script o aplicación de macOS. Un ejemplo de tal gestor de arranque es rEFInd . Si se instala en una partición EFI, será necesaria una contraseña para montar la partición. Si se instala en una partición FAT o ExFAT, no se necesitará contraseña, pero será menos seguro. La dirección default_selection se puede utilizar para elegir el sistema operativo por defecto para arrancar. Normalmente, este token y los parámetros se almacenan en un archivo de su elección. El nombre de este archivo se da entonces como parámetro al comando include almacenado en el refind.conf archivo.

0 votos

Sí, bless no funciona sin desactivar SIP. Pero la aplicación Preferencias del Sistema es capaz de cambiar el disco de arranque sin desactivar SIP. ¿Cómo lo hace la aplicación Preferencias del Sistema? Por lo que sé, todo lo que hace esa aplicación se puede programar de alguna manera (por ejemplo, muchos ajustes se pueden cambiar con /usr/bin/defaults y puede realizar actualizaciones del sistema con /usr/sbin/softwareupdate )

0 votos

Cuando se construye una aplicación o comando con Xcode las credenciales apropiadas tienen que existir en el proyecto para permitir que el ejecutable se salte las restricciones presentadas por SIP. Esto no se hace para bless. Para los comandos que pueden eludir SIP, Apple puede publicar el proyecto y el código fuente, pero no los archivos que contienen las credenciales. Por ejemplo, puede compilar el comando fsck_hfs descargando el archivo fuente . Sin embargo, su ejecutable no podrá eludir SIP, mientras que el proporcionado por MacOS 10.15 sí puede.

1voto

Professor Vector Puntos 131

El SIP fue el primer problema que he encontrado en Big Sur. Apagarlo parece una mala idea. Así que intenté algo como @Wowfunhappy sugirió pero con la actualización para adaptarse a la nueva ui OS y también añadir algunos funcional adicional. El segundo problema era volúmenes de destino elementos de la lista no tiene acciones. Lo que hace imposible hacer clic en ellos a través de clic o "clic en" funciones tal vez debido a algunas nuevas protecciones adicionales en Big Sur. Hacer click con AST y otros scripts tampoco funciona debido a las nuevas restricciones de MacOS. La única manera que he encontrado es usando Python click(pero esto lleva a un ligero retraso mientras scripts selecciona el volumen de destino).

Así que aquí está una conmutación totalmente automatizada:

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

Sólo tienes que cambiar dos propiedades targetVolume y passwordValue . La contraseña puede estar vacía y en ese caso puedes proporcionarla manualmente. A continuación, sólo tienes que copiar este script, pegarlo en el script Editor y exportar a través de Archivo -> Exportar -> formato de archivo - Aplicación, seleccione Sólo ejecución -> Guardar. Puedes hacer el mismo proceso para todos los sistemas que tengas, por ejemplo Big Sur 1, Big Sur 2, Bootcamp.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X