Có thể sử dụng tập lệnh.
Trước tiên, bạn nên kích hoạt menu script trong thanh menu OS X. Đọc phần "Menu Script" tại đây: Kích hoạt Menu Script
Bây giờ hãy mở thư mục Thư viện / Tập lệnh của bạn và tạo một tệp có tên "run_with_password.rb" với các nội dung này (thay đổi "johndoe" thành tên người dùng của bạn):
#!/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
Tiếp theo, khởi động Script Editor và dán mã này (một lần nữa thay đổi johndoe thành tên người dùng của bạn):
do shell script "ruby /Users/johndoe/Library/Scripts/run_with_password.rb /Applications/Mail.app" with administrator privileges
Lưu tệp vào Thư viện / Tập lệnh dưới dạng "mail_with_password", đảm bảo Định dạng tệp là "Tập lệnh".
Bây giờ "mail_with_password" sẽ xuất hiện trong menu tập lệnh của bạn. Mỗi khi bạn chạy nó, nó sẽ hỏi bạn mật khẩu của bạn (giống như một số trình cài đặt làm). Sau khi chạy xong, nó sẽ vô hiệu hóa quyền truy cập vào ứng dụng Mail thông thường. Vì vậy, hãy chạy tập lệnh một lần, sau đó thử chạy ứng dụng Thư. Nó sẽ không chạy. Lưu ý rằng điều đó có nghĩa là TẤT CẢ người dùng trên máy của bạn sẽ bị ngăn không cho chạy Mail trực tiếp, không chỉ người dùng của bạn.
Nếu bạn muốn cho phép Mail chạy bình thường trở lại, hãy chạy lệnh này tại Terminal:
sudo chmod +x /Applications/Mail.app/Contents/MacOS/Mail
Bạn có thể bỏ qua "sudo". Sử dụng sudo nếu bạn nhận được "Hoạt động không được phép". Lưu ý rằng sudo sẽ yêu cầu bạn nhập mật khẩu để cho phép hoạt động đặc quyền.
Hãy cẩn thận
- Nếu bạn không cần lệnh "sudo" ở trên để thực hiện chmod, điều đó có nghĩa là người dùng thông thái có thể tìm ra cách bật lại ứng dụng Thư. Bạn có thể thắt chặt bảo mật bằng cách thay đổi chủ sở hữu tệp MacOS / Mail thành root. Đó là một bài tập cho người đọc.
- Nếu ai đó có thể sao chép ứng dụng Thư vào máy tính của bạn (ví dụ: qua ổ USB), họ vẫn có thể truy cập vào thư của bạn.
- Kịch bản ruby có nghĩa là hoạt động cho hầu hết các gói ứng dụng OS X. Tôi không khuyên bạn nên điều chỉnh tập lệnh ruby trừ khi bạn thực sự biết bạn đang làm gì vì nó đang làm một số thứ nhất định là root (người dùng đặc quyền). Tinh chỉnh mã applescript nên vô hại; nhưng bạn nên biết cách điều chỉnh lệnh chmod để làm cho ứng dụng của bạn trực tiếp chạy lại được.
- Nếu đường dẫn đến ứng dụng trong tệp applescript có khoảng trắng hoặc các ký tự đặc biệt khác, bạn sẽ phải làm một cái gì đó như đặt dấu ngoặc đơn xung quanh toàn bộ đường dẫn.
- Chỉnh sửa: Người dùng Austin đề nghị quy trình này không bảo vệ các tệp .emlx. Tôi thực sự không sử dụng ứng dụng Thư vì vậy tôi không quen với việc lưu trữ dữ liệu. Các vấn đề tương tự áp dụng cho tất cả các ứng dụng - vì giải pháp này không ẩn dữ liệu người dùng.
Chứng hoang tưởng
Nếu ai đó biết ruby có quyền truy cập vào người dùng đã đăng nhập của bạn, họ có thể sửa đổi tập lệnh ruby theo cách tàn phá tất cả các loại tàn phá khi bạn chạy tập lệnh, vì nó chạy như root trong một phần thời gian. Nếu bạn nghĩ điều này có thể xảy ra, bạn nên tạo kịch bản chỉ có thể ghi bằng root. Bạn cũng sẽ phải đảm bảo ai đó không thay thế tập lệnh bằng chính tập lệnh của họ - họ có thể làm điều này nếu thư mục có thể ghi được bởi bạn. Nếu bạn bắt đầu sợ hãi bởi những cảnh báo này và không biết cách tự bảo vệ mình, có lẽ bạn nên quên đi giải pháp này và chỉ cần nhớ khóa màn hình khi bạn rời khỏi máy tính.
What's the best way to protect my email from snooping?
Và câu trả lời cho điều đó là tốt nhất nên ngăn chặn hoàn toàn người dùng trái phép sử dụng tài khoản của bạn - ví dụ: yêu cầu mật khẩu để tắt trình bảo vệ màn hình hoặc sau khi đánh thức hệ thống khỏi chế độ ngủ.