È possibile utilizzare gli script.
Per prima cosa, devi abilitare il menu script nella barra dei menu di OS X. Leggi la sezione "Menu Script" qui: Abilita il menu Script
Ora apri la cartella Libreria / Script e crea un file chiamato "run_with_password.rb" con questi contenuti (cambia "johndoe" con il tuo nome utente):
#!/usr/bin/env ruby
# run an app at lower privilege
require 'etc'
require 'find'
# Note: anyone with sudo access will be able to run as this user. But they could do that anyway.
# run 'id' at the terminal to find out what your username is.
RUN_USER = 'johndoe'
def get_root_info
root_entry = Etc.getpwnam('root')
return root_entry.uid, root_entry.gid
end
ROOT_UID, ROOT_GID = get_root_info
def ensure_root
Process.uid = ROOT_UID
Process.gid = ROOT_GID
end
def print_user_info
[
[:uid, Process.uid],
[:gid, Process.gid],
[:euid, Process.euid],
[:egid, Process.egid],
].each do |arr|
$stderr.puts arr.inspect
end
end
def set_effective(euid, egid)
$stderr.puts "setting effective to #{[euid, egid].inspect}" if $DEBUG
# must set group first
Process.egid = egid
Process.euid = euid
end
def do_privileged(&block)
orig_euid = Process.euid
orig_egid = Process.egid
begin
$stderr.puts "raising privileges" if $DEBUG
set_effective(ROOT_UID, ROOT_GID)
yield orig_euid, orig_egid
ensure
$stderr.puts "lowering privileges" if $DEBUG
set_effective(orig_euid, orig_egid)
end
end
# must be called after ROOT_UID, ROOT_GID are set
def chmod_files_in_dir(mode, dir)
mode_str = nil
case mode
when Integer
mode_str = '%o' % mode
when String
mode_str = mode
else
raise TypeError
end
chmod_proc = proc do
Find.find(dir) {|entry|
if File.directory?(entry) and entry != dir
Find.prune # don't recurse into subdirs
elsif File.file?(entry)
$stderr.puts "chmod #{mode_str} #{entry}" if $DEBUG
system 'chmod', mode_str, entry
end
}
end
# assume that if dir is owned by root, the executables are also.
if File.stat(dir).uid == ROOT_UID
do_privileged(&chmod_proc)
else
chmod_proc.call
end
end
def main(argv)
# Important: this is to abort if we're not running as root.
ensure_root
app_path = argv.shift or raise "Need path to .app file, e.g. /Applications/Mail.app"
app_macos_dir = File.join(app_path, 'Contents/MacOS')
File.directory?(app_path) or raise "#{app_path} is not an app bundle"
File.directory?(app_macos_dir) or raise "#{app_path} bundle doesn't have expected MacOS structure"
pw_entry = Etc.getpwnam(RUN_USER)
run_uid = pw_entry.uid
run_gid = pw_entry.gid
if $DEBUG
$stderr.puts [:run_uid, run_uid].inspect
$stderr.puts [:run_gid, run_gid].inspect
print_user_info
end
# Effectively become RUN_USER
set_effective(run_uid, run_gid)
if $DEBUG
print_user_info
end
begin
chmod_files_in_dir('+x', app_macos_dir)
# 'open' is asynchronous, so the ensure will run immediately after, and before the app exits.
$stderr.puts "Running app: #{app_path}" if $DEBUG
system 'open', app_path
ensure
chmod_files_in_dir('-x', app_macos_dir)
end
end
if __FILE__ == $0
$DEBUG = false
main(ARGV)
end
Quindi, avvia Script Editor e incolla questo codice (cambiando nuovamente johndoe con il tuo nome utente):
do shell script "ruby /Users/johndoe/Library/Scripts/run_with_password.rb /Applications/Mail.app" with administrator privileges
Salva il file in Libreria / Script come "mail_with_password", assicurandoti che il Formato file sia "Script".
Ora "mail_with_password" apparirà nel tuo menu di script. Ogni volta che lo esegui, ti chiederà la tua password (proprio come fanno alcuni installatori). Al termine dell'esecuzione, disabiliterà l'accesso all'applicazione di posta normale. Quindi esegui lo script una volta, quindi prova a eseguire l'app Mail. Non funzionerà. Tieni presente che significa che TUTTI gli utenti sul tuo computer non potranno eseguire direttamente Mail, non solo il tuo utente.
Se vuoi consentire a Mail di funzionare di nuovo normalmente, esegui questo comando sul Terminale:
sudo chmod +x /Applications/Mail.app/Contents/MacOS/Mail
Potresti essere in grado di omettere il "sudo". Usa sudo se ottieni "Operazione non consentita". Nota che sudo ti chiederà la tua password per consentire l'operazione privilegiata.
Avvertimenti
- Se non hai avuto bisogno del comando "sudo" qui sopra per fare il chmod, significa che un utente esperto potrebbe essere in grado di capire come abilitare nuovamente l'app Mail. È possibile aumentare la sicurezza modificando il proprietario del file MacOS / Mail su root. Rimane un esercizio per il lettore.
- Se qualcuno è in grado di copiare l'app Mail sul tuo computer (ad esempio tramite unità USB), può comunque accedere alla tua posta.
- Lo script ruby è pensato per funzionare per la maggior parte dei bundle di applicazioni OS X. Non raccomando di modificare lo script ruby a meno che tu non sappia veramente cosa stai facendo perché sta facendo alcune cose come root (l'utente privilegiato). Il tweaking del codice AppleScript dovrebbe essere innocuo; ma dovresti sapere come regolare il comando chmod per rendere nuovamente eseguibile la tua app direttamente
- Se il percorso dell'app nel file applescript ha spazi o altri caratteri speciali, dovrai fare qualcosa come mettere le virgolette su tutto il percorso.
- Modifica: l'utente Austin ha suggerito che questa procedura non protegge i file .emlx. In realtà non utilizzo l'app Mail, quindi non ho familiarità con l'archiviazione dei dati. Problemi simili si applicano a tutte le app, perché questa soluzione non nasconde i dati dell'utente.
Paranoia
Se qualcuno che conosce ruby ottiene l'accesso all'utente che ha effettuato l'accesso, potrebbe modificare lo script ruby in modo da provocare ogni sorta di caos quando si esegue lo script, poiché viene eseguito come root per una parte del tempo. Se pensi che questo possa accadere, dovresti rendere lo script scrivibile solo da root. Dovrai anche assicurarti che qualcuno non sostituisca lo script con il proprio: possono farlo se la cartella è scrivibile da te. Se stai iniziando a spaventarti con questi avvertimenti e non sai come proteggerti, probabilmente dovresti dimenticarti di questa soluzione e ricordati di bloccare lo schermo quando esci dal computer.