Это возможно с помощью скриптов.
Во-первых, вы должны включить меню сценариев в строке меню OS X. Прочитайте раздел «Меню сценариев» здесь: Включите меню сценариев
Теперь откройте папку Library / Scripts и создайте файл с именем «run_with_password.rb» со следующим содержимым (замените «johndoe» на ваше имя пользователя):
#!/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
Затем запустите Script Editor и вставьте этот код (снова сменив johndoe на ваше имя пользователя):
do shell script "ruby /Users/johndoe/Library/Scripts/run_with_password.rb /Applications/Mail.app" with administrator privileges
Сохраните файл в Library / Scripts как «mail_with_password», убедившись, что формат файла «Script».
Теперь «mail_with_password» появится в вашем скрипте меню. Каждый раз, когда вы запускаете его, он запрашивает ваш пароль (как это делают некоторые установщики). После завершения работы он отключит доступ к обычному почтовому приложению. Так что запустите скрипт один раз, затем попробуйте запустить приложение Почта. Это не будет работать. Обратите внимание, что это означает, что ВСЕ пользователи на вашем компьютере не смогут запускать Почту напрямую, а не только ваш пользователь.
Если вы когда-нибудь захотите снова запустить Mail нормально, запустите эту команду в Терминале:
sudo chmod +x /Applications/Mail.app/Contents/MacOS/Mail
Вы могли бы опустить "sudo". Используйте sudo, если вы получаете «Операция не разрешена». Обратите внимание, что sudo попросит вас ввести пароль, чтобы разрешить привилегированные операции.
Предостережения
- Если вам не нужна указанная выше команда «sudo» для выполнения chmod, это означает, что опытный пользователь сможет выяснить, как снова включить приложение Mail. Вы можете повысить безопасность, изменив владельца файла MacOS / Mail на root. Это оставлено в качестве упражнения для читателя.
- Если кто-то может скопировать приложение «Почта» на ваш компьютер (например, через USB-накопитель), он все равно может получить доступ к вашей почте.
- Сценарий ruby предназначен для работы с большинством приложений OS X. Я не рекомендую настраивать скрипт ruby, если вы действительно не знаете, что делаете, потому что он делает определенные вещи как root (привилегированный пользователь). Подстройка кода appleScript должна быть безвредной; но вы должны знать, как настроить команду chmod, чтобы снова запустить приложение.
- Если путь к приложению в файле applecript содержит пробелы или другие специальные символы, вам придется что-то сделать, например заключить в одинарные кавычки весь путь.
- Изменить: Пользователь Остин предположил, что эта процедура не защищает файлы .emlx. Я на самом деле не использую приложение Почта, поэтому я не знаком с хранилищем данных. Подобные проблемы относятся ко всем приложениям - потому что это решение не скрывает пользовательские данные.
паранойя
Если кто-то, кто знает ruby, получит доступ к вашему вошедшему в систему пользователю, он может изменить скрипт ruby таким образом, чтобы он вызывал всевозможные разрушения при запуске скрипта, так как он некоторое время запускается от имени root. Если вы думаете, что это может произойти, вы должны сделать скрипт доступным для записи только root. Вы также должны убедиться, что кто-то не заменит скрипт своим собственным - он может сделать это, если папка доступна для записи. Если вы начинаете бояться этих предупреждений и не знаете, как защитить себя, вам, вероятно, следует забыть об этом решении и просто забыть заблокировать экран, когда вы выходите из компьютера.
What's the best way to protect my email from snooping?
и ответ на этот вопрос заключается в том, что лучше всего полностью запретить неавторизованным пользователям использовать вашу учетную запись - например, требовать пароль для деактивации заставки или после выхода системы из спящего режима.