スクリプトを使用することは可能です。
まず、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
ファイルを「mail_with_password」としてライブラリ/スクリプトに保存し、ファイル形式が「スクリプト」であることを確認します。
これで、スクリプトメニューに「mail_with_password」が表示されます。実行するたびに、パスワードの入力を求められます(一部のインストーラーと同じように)。実行が完了すると、通常のメールアプリケーションへのアクセスが無効になります。そのため、スクリプトを1回実行してから、メールアプリを実行してみてください。実行されません。これは、ユーザーだけでなく、マシン上のすべてのユーザーが直接Mailを実行できないことを意味します。
Mailを再び正常に実行できるようにする場合は、ターミナルで次のコマンドを実行します。
sudo chmod +x /Applications/Mail.app/Contents/MacOS/Mail
「sudo」を省略できる場合があります。「操作は許可されていません」と表示される場合は、sudoを使用します。sudoは、特権操作を許可するためにパスワードを要求することに注意してください。
注意事項
- 上記の「sudo」コマンドを使用してchmodを実行する必要がなかった場合、それは知識のあるユーザーがMailアプリを再度有効にする方法を理解できる可能性があることを意味します。MacOS / Mailファイルの所有者をrootに変更することにより、セキュリティを強化できます。それは読者のための演習として残されました。
- 誰かが(たとえば、USBドライブを介して)メールアプリをコンピューターにコピーできる場合でも、メールにアクセスできます。
- rubyスクリプトは、ほとんどのOS Xアプリケーションバンドルで機能することを意図しています。root(特権ユーザー)として特定のことを行っているため、あなたが何をしているのか本当に理解していない限り、rubyスクリプトを微調整することはお勧めしません。applescriptコードの調整は無害です。ただし、chmodコマンドを調整してアプリを再び直接実行可能にする方法を知っておく必要があります。
- applescriptファイルのアプリへのパスにスペースまたはその他の特殊文字が含まれている場合、パス全体を一重引用符で囲むなどの操作を行う必要があります。
- 編集:ユーザーAustinは、この手順では.emlxファイルを保護しないことを提案しました。私は実際にメールアプリを使用していないので、データストレージに精通していません。同様の問題はすべてのアプリに当てはまります-このソリューションはユーザーデータを隠さないためです。
パラノイア
rubyを知っているユーザーがログインしているユーザーにアクセスできる場合、スクリプトを実行するときに一部のルートとして実行されるため、あらゆる種類の大混乱を引き起こす方法でrubyスクリプトを変更できます。これが起こる可能性があると思われる場合は、スクリプトをrootのみが書き込み可能にする必要があります。また、誰かがスクリプトを自分のものに置き換えないことを確認する必要があります。フォルダーが書き込み可能である場合、彼らはこれを行うことができます。これらの警告に怖がり始め、自分を守る方法がわからない場合は、おそらくこの解決策を忘れて、コンピューターを離れるときに画面をロックすることを忘れないでください。
What's the best way to protect my email from snooping?
、それに対する答えは、許可されていないユーザーがあなたのアカウントを使用することを完全に防ぐのが最善だということです-例えば、スクリーンセーバーを無効にするためにパスワードを要求したり、システムをスリープから復帰させた後です。