Jest to możliwe przy użyciu skryptów.
Najpierw należy włączyć menu skryptów na pasku menu OS X. Przeczytaj sekcję „Menu skryptu” tutaj: Włącz menu skryptu
Teraz otwórz folder Library / Scripts i utwórz plik o nazwie „run_with_password.rb” z tymi treściami (zmień „johndoe” na swoją nazwę użytkownika):
#!/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
Następnie uruchom edytor skryptów i wklej ten kod (ponownie zmieniając johndoe na swoją nazwę użytkownika):
do shell script "ruby /Users/johndoe/Library/Scripts/run_with_password.rb /Applications/Mail.app" with administrator privileges
Zapisz plik w bibliotece / skryptach jako „mail_with_password”, upewniając się, że format pliku to „Script”.
Teraz „mail_with_password” pojawi się w menu skryptu. Za każdym razem, gdy go uruchomisz, poprosi o podanie hasła (tak jak robią to niektórzy instalatorzy). Po uruchomieniu uruchomi dostęp do zwykłej aplikacji Mail. Uruchom skrypt raz, a następnie spróbuj uruchomić aplikację Mail. To nie będzie działać. Pamiętaj, że oznacza to, że WSZYSCY użytkownicy na twoim komputerze nie będą mogli bezpośrednio uruchamiać poczty, nie tylko twój użytkownik.
Jeśli kiedykolwiek chcesz zezwolić Mailowi na normalne działanie, uruchom to polecenie w Terminalu:
sudo chmod +x /Applications/Mail.app/Contents/MacOS/Mail
Możliwe, że możesz pominąć „sudo”. Użyj sudo, jeśli pojawi się komunikat „Operacja niedozwolona”. Pamiętaj, że sudo poprosi cię o podanie hasła, aby umożliwić uprzywilejowaną obsługę.
Ostrzeżenia
- Jeśli nie potrzebujesz powyższej komendy „sudo”, aby wykonać chmod, oznacza to, że doświadczony użytkownik może dowiedzieć się, jak ponownie włączyć aplikację Mail. Możesz zwiększyć bezpieczeństwo, zmieniając właściciela pliku MacOS / Mail na root. Zostało to ćwiczeniem dla czytelnika.
- Jeśli ktoś jest w stanie skopiować aplikację Mail na komputer (np. Za pomocą napędu USB), nadal może uzyskać dostęp do Twojej poczty.
- Skrypt ruby jest przeznaczony do pracy z większością pakietów aplikacji OS X. Nie zalecałem poprawiania skryptu ruby, chyba że naprawdę wiesz, co robisz, ponieważ robi pewne rzeczy jako root (uprzywilejowany użytkownik). Ulepszenie kodu AppleScript powinno być nieszkodliwe; ale powinieneś wiedzieć, jak dostosować komendę chmod, aby ponownie uruchomić aplikację bezpośrednio.
- Jeśli ścieżka do aplikacji w pliku AppleScript zawiera spacje lub inne znaki specjalne, musisz zrobić coś takiego, jak wstawianie pojedynczych cudzysłowów na całej ścieżce.
- Edycja: Użytkownik Austin zasugerował, że ta procedura nie chroni plików .emlx. Właściwie nie korzystam z aplikacji Mail, więc nie znam się na przechowywaniu danych. Podobne problemy dotyczą wszystkich aplikacji - ponieważ to rozwiązanie nie ukrywa danych użytkownika.
Paranoja
Jeśli ktoś, kto zna ruby, uzyska dostęp do zalogowanego użytkownika, może zmodyfikować skrypt ruby w taki sposób, że wywołuje on wszelkiego rodzaju spustoszenie podczas uruchamiania skryptu, ponieważ działa on przez pewien czas jako root. Jeśli uważasz, że tak się stanie, powinieneś uczynić skrypt zapisywalnym tylko przez root. Musisz także upewnić się, że ktoś nie zastąpi skryptu własnym - może to zrobić, jeśli folder jest zapisywalny. Jeśli zaczynasz bać się tych ostrzeżeń i nie wiesz, jak się zabezpieczyć, prawdopodobnie powinieneś zapomnieć o tym rozwiązaniu i pamiętaj tylko o zablokowaniu ekranu po wyjściu z komputera.
What's the best way to protect my email from snooping?
odpowiedź na to, że najlepiej jest całkowicie uniemożliwić nieautoryzowanym użytkownikom korzystanie z twojego konta - na przykład wymaganie hasła do dezaktywacji wygaszacza ekranu lub po wybudzeniu systemu ze stanu uśpienia.