by Graham Pugh
WARNING. This is a self-destruct script. Do not try it out on your own device!
erase-install.sh is a script to erase a Mac directly from the system volume, utilising the eraseinstall option of startosinstall, which is built into macOS installer applications since version 10.13.4.
If run without any options, the script will not perform the erase. This means that the script can also be used to pre-cache the installer, or simply to make it available for the user.
So, if run without any options, the script will do the following:
- Check if an installer is already present in the working directory of this script from a previous run.
- If not, check if an existing macOS installer is present in the
/Applicationsfolder. If present, checks that it isn't older than the current installed version. - If no valid installer is found, a forked version of
installinstallmacos.pyis downloaded. This is used to download the current macOS installer that is valid for this device (determined by Board ID and Model Identifier). The installer is compressed and placed in a.dmgin the working directory.
For more information on the forked version of installinstallmacos.py, see grahampugh/macadmin-scripts
There are a number of options that can be specified to automate this script further:
--eraseruns thestartosinstallcommand with the--eraseinstalloption to wipe the device. The parameter--confirmcan be added to present the user with a confirmation dialog which must be accepted to perform the erase process.--reinstallruns thestartosinstallcommand to reinstall the system OS on the device (without erasing the drive). Use this for upgrade/reinstall without losing data.--movemoved the macOS installer to/Applicationsor to a specified path if it isn't already there.--overwritedeletes any existing downloaded installer and re-downloads it.
If the --erase or --reinstall options are used, and additional packages are placed in the folder specified by the variable extra_installs, which can be overridden with the --extras argument, these packages will be as part of the erase-/re-install process. These packages must be signed.
For macOS 10.15 Catalina or greater, experimental support is added for softwareupdate --fetch-full-installer. This new functionality can be used to replace the use of installinstallmacos.py using the --fetch-full-installer option.
-
Run the script with argument
--helpto show the available options, then stop.sudo bash erase-install.sh --help -
Run the script with argument
--listto check the available installers. This will downloadinstallinstallmacos.pyand list the available updates, then stop.sudo bash erase-install.sh --list -
Run the script with no arguments to download the latest production installer. By default, this is stored in a DMG in the working directory of the
installinstallmacos.pyscript. If an existing installer is found locally on the disk (either in the default location, or in/Applications), and it is a valid installer (>10.13.4), it will not download it again.sudo bash erase-install.sh -
Run the script with argument
--overwriteto remove any existing macOS installer found in/Applicationsand download the latest production installer. By default, this is stored in a DMG in the working directory of theinstallinstallmacos.pyscript.sudo bash erase-install.sh --overwrite -
Run the script with argument
--samebuildto check for the installer which matches the current system macOS build (usingsw_vers), rather than the latest production installer. This allows the reinstallation of a forked or beta version that is already installed on the system volume.sudo bash erase-install.sh --samebuild -
Run the script with argument
--sameosto check for the installer which matches the currently installed macOS major version. This basically filters by version, and looks for the latest build matching the version. Useful if you want to avoid upgrading during erase-install, but don't want to have to specify a particular OS.sudo bash erase-install.sh --sameos -
Run the script with argument
--os=10.14to check for the installer which matches the specified macOS major version. This basically filters by version, and looks for the latest build matching the version. Useful during Golden Master periods.sudo bash erase-install.sh --os=10.14 -
Run the script with argument
--version=10.14.3to check for the installer which matches the specified macOS point version. This basically filters by version, and looks for the lowest build matching the version.sudo bash erase-install.sh --version=10.14.3 -
Run the script with argument
--build=XYZ123to check for the installer which matches the specified build ID, rather than the latest production installer or the same build. Note that it will only work if the build is compatible with the device on which you are running the script.sudo bash erase-install.sh --build=XYZ123 -
Run the script with argument
--moveto move the downloaded installer to the/Applicationsfolder. Note that this argument does not apply in conjunction with the--eraseorfflags.sudo bash erase-install.sh --move -
Run the script with arguments
--moveand--path=/some/pathto move the downloaded installer to the specified folder. Note that this argument does not apply in conjunction with the--eraseflag.sudo bash erase-install.sh --move --path=/path/to/move/to -
Run with
--eraseargument to check and download the installer as required and then run it to wipe the drive. Can be used in conjunction with the--os,--version,--build,--samebuildand--overwriteflags.sudo bash erase-install.sh --erase -
If the
--eraseoption is used, and additional packages are placed in the folder specified by the variableextra_installs, these packages will be as part of the erase-install process. These packages must be signed. The path to these packages can be overridden with the--extrasargument.sudo bash erase-install.sh --erase --extras=/path/containing/extra/packages -
If both the
--eraseand--confirmoptions are used, a Jamf Helper window is displayed and the user is prompted to confirm erasure prior to taking any action. If the user chooses to cancel, the script will exit.sudo bash erase-install.sh --erase --confirm -
Run with
--reinstallargument to check and download the installer as required and then run it to reinstall macOS on the system volume. Can be used in conjunction with the--os,--version,--build,--samebuildand--overwriteflags.sudo bash erase-install.sh --reinstall -
If the
--reinstalloption is used, and additional packages are placed in the folder specified by the variableextra_installs, these packages will be as part of the reinstall process. These packages must be signed. The path to these packages can be overridden with the--extrasargument.sudo bash erase-install.sh --reinstall --extras=/path/containing/extra/packages
Option in Catalina or greater only
-
Run the script with the
--fetch-full-installerargument to download the latest production installer usingsoftwareupdate --fetch-full-installer. This downloads the current latest installer to/Applications(the--moveoption does not function here). If an existing installer is found locally on the disk (either in the default location, or in/Applications), and it is a valid installer (>10.13.4), it will not download it again. Can be used in conjunction with the--version=10.X.Y,--reinstalland--erasearguments.sudo bash erase-install.sh --fetch-full-installer
- macOS 10.13.4+ is already installed on the device
- Device file system is APFS
Note that downloading the installer does not require 10.13.4 or APFS, it is just the startosinstall --eraseinstall command that requires it.
To run this script in Jamf Pro, upload the script, and then create a policy to run it. In the script parameters of the Policy, add the desired options, including the --.
For example, to create a policy named Erase and Reinstall macOS which is scoped models of Mac that can run the latest standard build, set parameters as follows:
- Parameter 4:
--erase
If you need a particular fork, create a policy scoped to the devices that require the forked build, and set parameters as follows:
- Parameter 4:
--erase - Parameter 5:
--build=18A389
If you want to pre-cache the installer in /Applications for use by another policy, make a policy named Download macOS Installer and set parameters as follows:
- Parameter 4:
--move - Parameter 5:
--overwrite
If you want to upgrade to macOS 10.14 while 10.13 installers are still available in the catalog, add this additional flag:
- Parameter 6:
--os=10.14
Or if you need to specify a particular point release version (say if more than one is available in the catalogue), add this additional flag:
- Parameter 6:
--version=10.14.3
Once the installer is in place in /Applications folder, you can create another policy using the same script to perform an in-place upgrade using the --reinstall option, without erasing the system.