เป็นไปได้โดยใช้สคริปต์
ก่อนอื่นคุณควรเปิดใช้งานเมนูสคริปต์ในแถบเมนู 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
ถัดไปเริ่มตัวแก้ไขสคริปต์และวางในรหัสนี้ (เปลี่ยน johndoe เป็นชื่อผู้ใช้ของคุณอีกครั้ง):
do shell script "ruby /Users/johndoe/Library/Scripts/run_with_password.rb /Applications/Mail.app" with administrator privileges
บันทึกไฟล์ลงใน Library / Scripts เป็น "mail_with_password" ตรวจสอบให้แน่ใจว่ารูปแบบไฟล์เป็น "สคริปต์"
ตอนนี้ "mail_with_password" จะปรากฏในเมนูสคริปต์ของคุณ ทุกครั้งที่คุณเรียกใช้มันจะขอรหัสผ่านจากคุณ (เหมือนกับที่ผู้ติดตั้งบางคนทำ) หลังจากทำงานเสร็จแล้วจะปิดใช้งานการเข้าถึงแอปพลิเคชันจดหมายทั่วไป ดังนั้นให้เรียกใช้สคริปต์หนึ่งครั้งจากนั้นลองเรียกใช้แอปอีเมล มันจะไม่ทำงาน โปรดทราบว่านั่นหมายความว่าผู้ใช้ทั้งหมดในเครื่องของคุณจะได้รับการป้องกันไม่ให้เรียกใช้จดหมายโดยตรง
หากคุณต้องการอนุญาตให้ Mail ทำงานตามปกติอีกครั้งให้เรียกใช้คำสั่งนี้ที่ Terminal:
sudo chmod +x /Applications/Mail.app/Contents/MacOS/Mail
คุณอาจไม่สนใจ "sudo" ใช้ sudo หากคุณได้รับ "ไม่อนุญาตให้ใช้งาน" โปรดทราบว่า sudo จะขอรหัสผ่านจากคุณเพื่ออนุญาตการดำเนินการพิเศษ
คำเตือน
- หากคุณไม่ต้องการคำสั่ง "sudo" ด้านบนเพื่อทำ chmod นั่นหมายความว่าผู้ใช้ที่มีความรอบรู้อาจสามารถหาวิธีเปิดใช้แอปอีเมลอีกครั้ง คุณสามารถกระชับความปลอดภัยโดยการเปลี่ยนเจ้าของไฟล์ MacOS / Mail เป็นรูท ที่เหลือเป็นแบบฝึกหัดสำหรับผู้อ่าน
- หากใครบางคนสามารถคัดลอกแอปจดหมายไปยังคอมพิวเตอร์ของคุณ (เช่นผ่านไดรฟ์ USB) พวกเขายังคงสามารถเข้าถึงจดหมายของคุณได้
- สคริปต์ ruby มีวัตถุประสงค์เพื่อใช้งานกับแอปพลิเคชัน OS X ส่วนใหญ่ ฉันไม่แนะนำให้ปรับแต่งสคริปต์ ruby เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่เพราะทำบางสิ่งเป็นรูท (ผู้ใช้ที่มีสิทธิพิเศษ) การปรับแต่งรหัสแอปพลิเคชันควรไม่เป็นอันตราย แต่คุณควรรู้วิธีการปรับคำสั่ง chmod เพื่อให้แอปของคุณทำงานได้อีกครั้งโดยตรง
- หากเส้นทางไปยังแอปในไฟล์ applescript มีช่องว่างหรืออักขระพิเศษอื่น ๆ คุณจะต้องทำอะไรเช่นใส่เครื่องหมายคำพูดเดี่ยวรอบ ๆ พา ธ ทั้งหมด
- แก้ไข: ผู้ใช้ Austin แนะนำว่าขั้นตอนนี้ไม่ได้ป้องกันไฟล์. emlx จริงๆแล้วฉันไม่ได้ใช้แอพ Mail ดังนั้นฉันจึงไม่คุ้นเคยกับที่เก็บข้อมูล ปัญหาที่คล้ายกันนำไปใช้กับแอพทั้งหมด - เพราะวิธีนี้ไม่ได้ซ่อนข้อมูลผู้ใช้
ความหวาดระแวง
หากใครบางคนที่รู้จัก ruby เข้าถึงผู้ใช้ที่ล็อกอินของคุณพวกเขาสามารถแก้ไข ruby script ในแบบที่ทำให้เกิดความเสียหายได้ทุกประเภทเมื่อคุณเรียกใช้สคริปต์เนื่องจากมันทำงานเป็นรูทในบางครั้ง หากคุณคิดว่าสิ่งนี้อาจเกิดขึ้นคุณควรทำให้สคริปต์เขียนได้เฉพาะโดยรูท คุณจะต้องตรวจสอบให้แน่ใจว่าบางคนไม่ได้แทนที่สคริปต์ด้วยตนเอง - พวกเขาสามารถทำสิ่งนี้ได้หากโฟลเดอร์นั้นสามารถเขียนได้โดยคุณ หากคุณเริ่มกลัวคำเตือนเหล่านี้และไม่รู้วิธีป้องกันตัวคุณเองคุณอาจจะลืมวิธีแก้ปัญหานี้และอย่าลืมล็อคหน้าจอเมื่อออกจากคอมพิวเตอร์
What's the best way to protect my email from snooping?
และคำตอบคือควรป้องกันผู้ใช้ที่ไม่ได้รับอนุญาตใช้บัญชีของคุณอย่างสมบูรณ์ตัวอย่างเช่นต้องการรหัสผ่านเพื่อปิดหน้าจอหรือหลังจากที่ระบบออกจากโหมดสลีป