Skip to content

Instantly share code, notes, and snippets.

@lxneng
Forked from junkblocker/disable.sh
Created December 20, 2019 08:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lxneng/0146394ab7296a34cd6da9ae3cac8771 to your computer and use it in GitHub Desktop.
Save lxneng/0146394ab7296a34cd6da9ae3cac8771 to your computer and use it in GitHub Desktop.
Disable bunch of #$!@ in Catalina
#!/bin/bash
if [[ "$(sw_vers -productVersion)" != 10\.15* ]]; then
echo "This is only meant to run on macOS 10.15.* Catalina" >&2
exit 1
fi
reply=
printf "Are you pretty damn sure you want to run this? (Yes/No) "
read -r reply
[[ $reply != Yes ]] && exit 1
LC_ALL=C
export LC_ALL
me="${0##*/}"
set -o errexit
set -o nounset
set -o pipefail
IFS=$'\n\t'
# IMPORTANT: Don't forget to logout from your Apple ID in the settings before running it!
signed_out=false
if [[ -z "$(command -v mas)" && -n "$(command -v brew)" ]]; then
brew install mas
fi
if ! mas signout; then
echo "Could not sign out of the apple store automatically." >&2
else
signed_out=true
fi
if ! $signed_out; then
reply=
while [[ "$reply" != "OK" ]]; do
echo "Please sign out of apple store before proceeding. Type OK when ready or press Ctrl+c to abort."
read -r reply
done
fi
# IMPORTANT: You will need to run this script from Recovery. In fact, macOS Catalina brings read-only filesystem which prevent this script from working from the main OS.
if ! csrutil status | grep -q ' disabled.$'; then
echo "System Integrity Protection is enabled. Can not proceed." >&2
exit 1
fi
sudo mount -uw /
# This script needs to be run from the volume you wish to use.
# E.g. run it like this: cd /Volumes/Macintosh\ HD && sh /Volumes/Macintosh\ HD/Users/sabri/Desktop/disable.sh
full_dir="$(cd "$(dirname $BASH_SOURCE)" && pwd)"
cd "/Volumes/Macintosh HD"
if [[ "${1-}" != "execed" ]]; then
exec "/Volumes/Macintosh HD${full_dir}/${BASH_SOURCE##*/}" execed
fi
disable() {
local what kind
what="$1"
kind="$2"
if [[ -e "./System/Library/Launch${kind}s/${what}.plist" ]]; then
if [[ -e "./System/Library/Launch${kind}s/${what}.plist.org" ]]; then
if ! cmp "./System/Library/Launch${kind}s/${what}.plist" "./System/Library/Launch${kind}s/${what}.plist.org"; then
echo "INFO : Backup ./System/Library/Launch${kind}s/${what}.plist.org"
echo "INFO : Original ./System/Library/Launch${kind}s/${what}.plist"
echo "INFO : are different"
sudo diff -Naup "./System/Library/Launch${kind}s/${what}.plist" "./System/Library/Launch${kind}s/${what}.plist.org"
printf "INFO : Overwrite backup (y/N)? "
reply=
read -r reply
case "$reply" in
y* | Y*)
if ! sudo cp -f "./System/Library/Launch${kind}s/${what}.plist" "./System/Library/Launch${kind}s/${what}.plist.org"; then
echo "FAILURE: Backup failed" >&2
return
fi
;;
esac
fi
fi
# Yes, both without and with sudo - See https://www.chromium.org/developers/how-tos/debugging-on-os-x
launchctl unload -wF "./System/Library/Launch${kind}s/${what}.plist" || true
sudo launchctl unload -wF "./System/Library/Launch${kind}s/${what}.plist" || true
if [[ ! -e "./System/Library/Launch${kind}s/${what}.plist.prg" ]]; then
if sudo mv "./System/Library/Launch${kind}s/${what}.plist" "./System/Library/Launch${kind}s/${what}.plist.org"; then
echo "SUCCESS: ${kind} ${what} disabled"
return
fi
echo "FAILURE: ${kind} ${what} could not be disabled"
else
echo "SUCCESS: ${kind} ${what} already disabled"
return
fi
else
if [[ -e "./System/Library/Launch${kind}s/${what}.plist.org" ]]; then
echo "SUCCESS: $kind $what already disabled"
return
else
echo "[??] ${kind} ${what} not present"
fi
fi
}
# WARNING: It might disable things that you may not like. Please double check the services in the various TO_DISABLE vars.
# Get active services: launchctl list | grep -v "\-\t0"
# Find a service: grep -lR [service] /System/Library/Launch* /Library/Launch* ~/Library/LaunchAgents
# Agents to disable
# 'com.apple.speech.speechdatainstallerd' 'com.apple.speech.speechsynthesisd' 'com.apple.speech.synthesisserver' will freeze Edit menus
# 'com.apple.bird' will prevent saving prompt from being shown
AGENTS_TO_DISABLE=()
# iCloud
AGENTS_TO_DISABLE+=('com.apple.security.cloudkeychainproxy3'
'com.apple.iCloudUserNotifications'
'com.apple.icloud.findmydeviced.findmydevice-user-agent'
'com.apple.icloud.fmfd'
'com.apple.icloud.searchpartyuseragent'
'com.apple.cloudd'
'com.apple.cloudpaird'
# cloudphotod is the iCloud Photos agent. It is responsible for all iCloud Photos activity.
'com.apple.cloudphotod'
'com.apple.followupd'
'com.apple.protectedcloudstorage.protectedcloudkeysyncing')
# Safari useless stuff
AGENTS_TO_DISABLE+=('com.apple.SafariBookmarksSyncAgent'
'com.apple.SafariCloudHistoryPushAgent'
# 'com.apple.WebKit.PluginAgent'
)
# iMessage / Facetime
AGENTS_TO_DISABLE+=('com.apple.imagent'
'com.apple.imautomatichistorydeletionagent'
'com.apple.imklaunchagent'
'com.apple.imtransferagent'
'com.apple.avconferenced')
# Game Center / Passbook / Apple TV / Homekit...
AGENTS_TO_DISABLE+=('com.apple.gamed'
'com.apple.passd'
'com.apple.Maps.pushdaemon'
'com.apple.videosubscriptionsd'
'com.apple.CommCenter-osx'
# homed is a daemon that manages home state and controls HomeKit accessories.
'com.apple.homed')
# Ad-related
AGENTS_TO_DISABLE+=('com.apple.ap.adprivacyd'
'com.apple.ap.adservicesd')
## Screensharing
#AGENTS_TO_DISABLE+=('com.apple.screensharing.MessagesAgent' \
# 'com.apple.screensharing.agent' \
# 'com.apple.screensharing.menuextra')
# Siri
AGENTS_TO_DISABLE+=('com.apple.siriknowledged'
'com.apple.assistant_service'
'com.apple.assistantd'
'com.apple.Siri.agent'
'com.apple.parsec-fbf')
## VoiceOver / accessibility-related stuff
#AGENTS_TO_DISABLE+=('com.apple.VoiceOver' \
# 'com.apple.voicememod' \
# 'com.apple.accessibility.AXVisualSupportAgent' \
# 'com.apple.accessibility.dfrhud' \
# 'com.apple.accessibility.heard')
# Quicklook
#AGENTS_TO_DISABLE+=(
# 'com.apple.quicklook.ui.helper'
# 'com.apple.quicklook.ThumbnailsAgent'
# 'com.apple.quicklook')
# Sidecar
AGENTS_TO_DISABLE+=(
'com.apple.sidecar-hid-relay'
'com.apple.sidecar-relay'
)
# Debugging process
AGENTS_TO_DISABLE+=(
'com.apple.spindump_agent'
'com.apple.ReportCrash'
'com.apple.ReportGPURestart'
'com.apple.ReportPanic'
# 'com.apple.DiagnosticReportCleanup'
# 'com.apple.TrustEvaluationAgent'
)
# Screentime
AGENTS_TO_DISABLE+=('com.apple.ScreenTimeAgent'
'com.apple.UsageTrackingAgent')
# Others
AGENTS_TO_DISABLE+=(
'com.apple.AirPlayUIAgent'
'com.apple.AirPortBaseStationAgent'
'com.apple.familycircled'
'com.apple.familycontrols.useragent'
'com.apple.familynotificationd'
# parsecd is location-based suggestions for Siri.
'com.apple.parsecd'
'com.apple.SocialPushAgent'
)
#AGENTS_TO_DISABLE+=('com.apple.telephonyutilities.callservicesd' \
# 'com.apple.photoanalysisd' \
# 'com.apple.AOSPushRelay' # Needed for Music.app
# 'com.apple.AOSHeartbeat' # Needed for Music.app
# 'com.apple.AMPArtworkAgent' # Needed for Music.app
# 'com.apple.findmymacmessenger' \
# sharingd is used by the Finder to enable AirDrop file sharing, connecting to
# shared computers, and accessing Remote Discs from other computers.
# 'com.apple.sharingd' \
# identityservicesd is a background process (Identity Services Daemon) that deals with
# third-party credentials.
# 'com.apple.identityservicesd' \
# 'com.apple.java.InstallOnDemand' \
# 'com.apple.parentalcontrols.check' \
# 'com.apple.security.keychain-circle-notification' \
# syncdefaultsd is the system daemon backing the NSUbiquitousKeyValueStore feature.
# 'com.apple.syncdefaultsd' \
# 'com.apple.appleseed.seedusaged' \
# 'com.apple.appleseed.seedusaged.postinstall' \
# 'com.apple.CallHistorySyncHelper' \
# 'com.apple.RemoteDesktop' \
# 'com.apple.CallHistoryPluginHelper' \
# 'com.apple.touristd' \
# 'com.apple.macos.studentd' \
# 'com.apple.KeyboardAccessAgent' \
# 'com.apple.exchange.exchangesyncd' \
# suggestd -- daemon that processes user content in order to detect contacts, events, named entities, etc.
# 'com.apple.suggestd' \
# 'com.apple.AddressBook.abd' \
# helpd is a macOS agent that manages software documentation.
# 'com.apple.helpd' \
# mediasharingd is a per-user daemon which manages the user's media library sharing.
# 'com.apple.amp.mediasharingd' \
# mediaanalysisd photos that's identifying faces and objects. It is CPU intensive process
# 'com.apple.mediaanalysisd' \
# 'com.apple.mediaremoteagent' \
# 'com.apple.remindd')
for agent in "${AGENTS_TO_DISABLE[@]}"; do
disable "$agent" Agent
done
# Daemons to disable
DAEMONS_TO_DISABLE=()
# iCloud
DAEMONS_TO_DISABLE+=(
# It's a data logging daemon. It collects your usage data and
# sends it to apple and/or app devs for analytics.
'com.apple.analyticsd'
)
# Others
DAEMONS_TO_DISABLE+=(
# Not in Catalina
# 'com.apple.SubmitDiagInfo'
)
# 'com.apple.netbiosd' \
# 'com.apple.preferences.timezone.admintool' \
# 'com.apple.remotepairtool' \
# Full Disk Encryption Key Recovery Transmission Agent
# sends encrypted CoreStorage key recovery information to Apple. It is run
# only when "Store the recovery key with Apple" is selected, and even then only if the infor-
# mation could not be transmitted when that option was first selected.
# 'com.apple.security.FDERecoveryAgent' \
# 'com.apple.screensharing' \
# 'com.apple.appleseed.fbahelperd' \
# apsd ApplePushService daemon for Apple Push Notification service. This is part of the
# ApplePushService framework.
# 'com.apple.apsd' \
# Device Enollment
# 'com.apple.ManagedClient.cloudconfigurationd' \
# 'com.apple.ManagedClient.enroll' \
# 'com.apple.ManagedClient' \
# 'com.apple.ManagedClient.startup' \
# 'com.apple.locate' \
# 'com.apple.locationd' \
# eapolcfg_auth daemon used to configure EAP over LAN (EAPOL).
# allows an authorized process to perform privileged EAPOL configuration operations.
# 'com.apple.eapolcfg_auth' \
# 'com.apple.RemoteDesktop.PrivilegeProxy' \
# 'com.apple.mediaremoted')
for daemon in "${DAEMONS_TO_DISABLE[@]}"; do
disable "$daemon" Daemon
done
# vim: set et fdm=manual fenc=utf-8 ff=unix ft=sh ft=sh sts=0 sw=4 ts=4 tw=0 nowrap :
#!/bin/bash
if [[ "$(sw_vers -productVersion)" != 10\.15* ]]; then
echo "This is only meant to run on macOS 10.15.* Catalina" >&2
exit 1
fi
LC_ALL=C
export LC_ALL
me="${0##*/}"
set -o errexit
set -o nounset
set -o pipefail
IFS=$'\n\t'
# IMPORTANT: Don't forget to logout from your Apple ID in the settings before running it!
signed_out=false
if [[ -z "$(command -v mas)" && -n "$(command -v brew)" ]]; then
brew install mas
fi
if ! mas signout; then
echo "Could not sign out of the apple store automatically." >&2
else
signed_out=true
fi
if ! $signed_out; then
reply=
while [[ "$reply" != "OK" ]]; do
echo "Please sign out of apple store before proceeding. Type OK when ready or press Ctrl+c to abort."
read -r reply
done
fi
# IMPORTANT: You will need to run this script from Recovery. In fact, macOS Catalina brings read-only filesystem which prevent this script from working from the main OS.
if ! csrutil status | grep -q ' disabled.$'; then
echo "System Integrity Protection is enabled. Can not proceed." >&2
exit 1
fi
sudo mount -uw /
# This script needs to be run from the volume you wish to use.
# E.g. run it like this: cd /Volumes/Macintosh\ HD && sh /Volumes/Macintosh\ HD/Users/sabri/Desktop/disable.sh
full_dir="$(cd "$(dirname $BASH_SOURCE)" && pwd)"
cd "/Volumes/Macintosh HD"
if [[ "${1-}" != "execed" ]]; then
exec "/Volumes/Macintosh HD${full_dir}/${BASH_SOURCE##*/}" execed
fi
enable() {
local what kind
what="$1"
kind="$2"
if [[ ! -e ./System/Library/Launch${kind}s/${what}.plist ]]; then
if [[ -e ./System/Library/Launch${kind}s/${what}.plist.org ]]; then
if sudo mv "./System/Library/Launch${kind}s/${what}.plist.org" "./System/Library/Launch${kind}s/${what}.plist"; then
echo "SUCCESS: ${kind} ${what} enabled"
launchctl load -w "./System/Library/Launch${kind}s/${what}.plist" || true
sudo launchctl load -w "./System/Library/Launch${kind}s/${what}.plist" || true
return
fi
fi
echo "FAILURE: ${kind} ${what} could not be enabled"
fi
}
# Get active services: launchctl list | grep -v "\-\t0"
# Find a service: grep -lR [service] /System/Library/Launch* /Library/Launch* ~/Library/LaunchAgents
# Agents to enable
AGENTS_TO_ENABLE=()
# iCloud
AGENTS_TO_ENABLE+=('com.apple.security.cloudkeychainproxy3'
'com.apple.iCloudUserNotifications'
'com.apple.icloud.findmydeviced.findmydevice-user-agent'
'com.apple.icloud.fmfd'
'com.apple.icloud.searchpartyuseragent'
'com.apple.cloudd'
'com.apple.cloudpaird'
'com.apple.cloudphotod'
'com.apple.followupd'
'com.apple.protectedcloudstorage.protectedcloudkeysyncing')
# Safari useless stuff
AGENTS_TO_ENABLE+=('com.apple.SafariBookmarksSyncAgent'
'com.apple.SafariCloudHistoryPushAgent'
'com.apple.WebKit.PluginAgent')
# iMessage / Facetime
AGENTS_TO_ENABLE+=('com.apple.imagent'
'com.apple.imautomatichistorydeletionagent'
'com.apple.imklaunchagent'
'com.apple.imtransferagent'
'com.apple.avconferenced')
# Game Center / Passbook / Apple TV / Homekit...
AGENTS_TO_ENABLE+=('com.apple.gamed'
'com.apple.passd'
'com.apple.Maps.pushdaemon'
'com.apple.videosubscriptionsd'
'com.apple.CommCenter-osx'
'com.apple.homed')
# Ad-related
AGENTS_TO_ENABLE+=('com.apple.ap.adprivacyd'
'com.apple.ap.adservicesd')
# Screensharing
AGENTS_TO_ENABLE+=('com.apple.screensharing.MessagesAgent'
'com.apple.screensharing.agent'
'com.apple.screensharing.menuextra')
# Siri
AGENTS_TO_ENABLE+=('com.apple.siriknowledged'
'com.apple.assistant_service'
'com.apple.assistantd'
'com.apple.Siri.agent'
'com.apple.parsec-fbf')
# VoiceOver / accessibility-related stuff
AGENTS_TO_ENABLE+=('com.apple.VoiceOver'
'com.apple.voicememod'
'com.apple.accessibility.AXVisualSupportAgent'
'com.apple.accessibility.dfrhud'
'com.apple.accessibility.heard')
# Quicklook
AGENTS_TO_ENABLE+=('com.apple.quicklook.ui.helper'
'com.apple.quicklook.ThumbnailsAgent'
'com.apple.quicklook')
# Sidecar
AGENTS_TO_ENABLE+=('com.apple.sidecar-hid-relay'
'com.apple.sidecar-relay')
# Debugging process
AGENTS_TO_ENABLE+=(
'com.apple.spindump_agent'
'com.apple.ReportCrash'
'com.apple.ReportCrash.Root'
'com.apple.ReportGPURestart'
'com.apple.ReportPanic'
'com.apple.DiagnosticReportCleanup'
'com.apple.TrustEvaluationAgent')
# Screentime
AGENTS_TO_ENABLE+=('com.apple.ScreenTimeAgent'
'com.apple.UsageTrackingAgent')
# Others
AGENTS_TO_ENABLE+=('com.apple.telephonyutilities.callservicesd'
'com.apple.photoanalysisd'
'com.apple.parsecd'
'com.apple.AOSPushRelay'
'com.apple.AOSHeartbeat'
'com.apple.AMPArtworkAgent'
'com.apple.AirPlayUIAgent'
'com.apple.AirPortBaseStationAgent'
'com.apple.familycircled'
'com.apple.familycontrols.useragent'
'com.apple.familynotificationd'
'com.apple.findmymacmessenger'
'com.apple.sharingd'
'com.apple.identityservicesd'
'com.apple.java.InstallOnDemand'
'com.apple.parentalcontrols.check'
'com.apple.security.keychain-circle-notification'
'com.apple.syncdefaultsd'
'com.apple.appleseed.seedusaged'
'com.apple.appleseed.seedusaged.postinstall'
'com.apple.CallHistorySyncHelper'
'com.apple.RemoteDesktop'
'com.apple.CallHistoryPluginHelper'
'com.apple.SocialPushAgent'
'com.apple.touristd'
'com.apple.macos.studentd'
'com.apple.KeyboardAccessAgent'
'com.apple.exchange.exchangesyncd'
'com.apple.suggestd'
'com.apple.AddressBook.abd'
'com.apple.helpd'
'com.apple.amp.mediasharingd'
'com.apple.mediaanalysisd'
'com.apple.mediaremoteagent'
'com.apple.remindd')
for agent in "${AGENTS_TO_ENABLE[@]}"; do
enable "${agent}" Agent
done
# Daemons to enable
DAEMONS_TO_ENABLE=()
# iCloud
DAEMONS_TO_ENABLE+=('com.apple.analyticsd')
# Others
DAEMONS_TO_ENABLE+=('com.apple.netbiosd'
'com.apple.preferences.timezone.admintool'
'com.apple.remotepairtool'
'com.apple.security.FDERecoveryAgent'
# Not in Catalina
# 'com.apple.SubmitDiagInfo'
'com.apple.screensharing'
'com.apple.appleseed.fbahelperd'
'com.apple.apsd'
'com.apple.ManagedClient.cloudconfigurationd'
'com.apple.ManagedClient.enroll'
'com.apple.ManagedClient'
'com.apple.ManagedClient.startup'
'com.apple.locate'
'com.apple.locationd'
'com.apple.eapolcfg_auth'
'com.apple.RemoteDesktop.PrivilegeProxy'
'com.apple.mediaremoted')
for daemon in "${DAEMONS_TO_ENABLE[@]}"; do
enable "${daemon}" Daemon
done
# vim: set et fdm=manual fenc=utf-8 ff=unix ft=sh ft=sh sts=0 sw=4 ts=4 tw=0 nowrap :
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment