Mac OS X: 登錄/退出自動(dòng)運(yùn)行程序的設(shè)置
Update:
2009-02-22: 添加了E.AppleScript的部分
簡介 :本文介紹了普通用戶如何設(shè)置啟動(dòng)程序,后面針對高級(jí)用戶或者管理員討論了4種不同的設(shè)定啟動(dòng)程序的方法,一種設(shè)置退出程序運(yùn)行的方法,并初步討論了對于企業(yè)用戶需要考慮的一些方面,和多重啟動(dòng)程序的shell腳本的管理。
介紹幾個(gè)簡單的方法,其中1和2適用于普通/入門級(jí)用戶,后面的3適合于管理員或者高級(jí)用戶,而4討論了適合于企業(yè)管理員的管理方式,供參考。
Update History:
2009-02-14:
Initial
2009-02-15:
1. 題目的變更
2. 更改了一個(gè)錯(cuò)誤:3.A中的不是loginwindow.plist 而是loginitems.plist文件。
3. 一些措詞的變化和前言
我 們知道,在Windows里面,普通用戶可以通過把程序或者是快捷方式復(fù)制到自己的Programs/Startup目錄中就在以后登錄系統(tǒng)時(shí),讓W(xué)indows自動(dòng)執(zhí)行那個(gè)程序,而且管理員也可以通過Group Policy等方式強(qiáng)迫程序運(yùn)行。
在OS X中,對于普通用戶,操作也是非常簡單的,而且可以通過多個(gè)途徑進(jìn)行設(shè)置管理。
下面介紹幾個(gè)簡單的方法,其中1和2適用于普通/入門級(jí)用戶,后面的3適合于管理員或者高級(jí)用戶,而4討論了適合于企業(yè)級(jí)管理員的管理方式,供參考。
1. 最簡單的方法 就是,當(dāng)用戶在Dock上的一個(gè)圖標(biāo)上按住鼠標(biāo)不動(dòng),那么就會(huì)彈出一個(gè)菜單,其中一項(xiàng)就是"Open at Login", 只要是選擇上,那么這個(gè)程序就會(huì)在該用戶下次登錄時(shí)自動(dòng)運(yùn)行,大家不妨試試。
2. 通過Account管理:
這個(gè)是比較中規(guī)中舉的設(shè)置方式,一般用戶,只要是可以打開System Preferences中的Accounts那么就可以自己設(shè)置啟動(dòng)程序, 如下圖,有可能首先需要在左下角解鎖才能變更選項(xiàng),在左邊的用戶列表中選中用戶自己,在右邊會(huì)有Login Items標(biāo)簽出現(xiàn),進(jìn)入后用戶可以添加或者刪除現(xiàn)在的Login Items. 而上面第一種方法設(shè)置的啟動(dòng)程序,也會(huì)在這個(gè)列表中列出來。
3. 高級(jí)操作:
大家都知道,在OS X中的配置信息一般都儲(chǔ)存在.plist文件中,就如同Windows的都儲(chǔ)存在Registry里面一樣,但是OS X的.plist文件可能比較分散,而且是分級(jí)的。
就拿上面用戶針對自己的環(huán)境的設(shè)置,都儲(chǔ)存在該用戶的Library文件夾中,具體說,上面的設(shè)置在/Users/用戶名/Library /Preferences/com.apple.loginitems.plist文件中,如果用Property List Editor查看,可以看到他們在SessionItems->CustomListItems里面。這些設(shè)置只是針對該用戶起作用,而且運(yùn)行權(quán)限 是該用戶所擁有的權(quán)限。
對于管理員來說,不會(huì)為每一個(gè)用戶單獨(dú)設(shè)置這些啟動(dòng)選項(xiàng),而且這些選項(xiàng)對于該用戶是可以改動(dòng)的,無法做到強(qiáng)制執(zhí)行,所以管理員要對所有用戶進(jìn)行設(shè)置。這一般有四種方法:
A. 如果沒有特殊的權(quán)限要求,那么可以通過添加項(xiàng)目到 /Library/Preferences/com.apple.loginitems.plist( loginwindow.plist) 文件中的鍵值 privilegedlist->CustomListItems 下面的方法來實(shí)現(xiàn)。具體的鍵值內(nèi)容可以參見用戶底下的loginitems.plist文件的設(shè)置內(nèi)容。
B. 或者通過生成一個(gè)可執(zhí)行文件plist控制文件,并把它放置在/Library/LaunchAgents里面,也可以達(dá)到自動(dòng)運(yùn)行的效果,但是這個(gè)程序是以root用戶權(quán)限運(yùn)行的。(其實(shí)嚴(yán)格來說這個(gè)方法不屬于login/logout hook)
C. 第一種LoginHook:
如果你的系統(tǒng)版本是Mac OS X 10.2.x, 10.3.x, or 10.4.2,那么可以使用這個(gè)方法。
打開/etc/ttys文件,找到下面的一命令行:
#console "/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow" vt100 on secure window=/System/Library/CoreServices/WindowServer onoption="/usr/libexec/getty std.9600"
然后把你的登錄腳本語句加入如下(紅色的部分):
#console "/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow -LoginHook /path/to/script " vt100 on secure window=/System/Library/CoreServices/WindowServer onoption="/usr/libexec/getty std.9600"
這樣你的腳本就可以運(yùn)行了,應(yīng)該說這種方法只適用于shell腳本的運(yùn)行。
D. Login/Logout Hook:
這個(gè)方法功能比上面的都強(qiáng),因?yàn)樗梢灾С滞顺?Logout)的控制,上面的方法都只是對登錄(Login)自動(dòng)運(yùn)行的控制,無法控制退出進(jìn)程,而都是由loginwindow進(jìn)程/程序來自動(dòng)管理,這樣對于要求在用戶退出前需要進(jìn)行清除步驟的,上面的方法都無法實(shí)現(xiàn)(當(dāng)然了如果可以花費(fèi)更多時(shí)間編寫daemons,當(dāng)然可以完成相關(guān)操作),而這個(gè)方法提供一個(gè)簡單的接口。
這種方法 shell腳本運(yùn)行root用戶的權(quán)限,這給管理員最大的自由度,而且對于一般用戶比較隱蔽,而且也無法查看或者變更。
下面的操作都在root用戶里面執(zhí)行,所以:
sudo -s
cd /var/root/
首先創(chuàng)建一個(gè)腳本文件,比如/var/root/LoginHook/loginhook.sh和logouthook.sh
然后不能忘記設(shè)置可執(zhí)行屬性:
chmod u+x /var/root/LoginHook/loginhook.sh
chmod u+x /var/root/LoginHook/logouthook.sh
最后設(shè)置:
defaults write com.apple.loginwindow LoginHook /var/root/LoginHook/loginhook.sh
defaults write com.apple.loginwindow LoginHook /var/root/LogoutHook/logouthook.sh
大功告成!
E. AppleScript的方案 :
使用AppleScrip同樣可以完成自動(dòng)運(yùn)行程序,比如下面的例子,自動(dòng)運(yùn)行/Applicaions/TextEdit.app程序.
如果希望更加通用的程序,可以使用下面的變化,比如保存為AddStarupItem:
使用方法就是:
利用AppleScript還可以自動(dòng)刪除一個(gè)自動(dòng)運(yùn)行程序, 比如:
4. 進(jìn)一步的考慮:
最后我們來進(jìn)一步改進(jìn)上面3.D里面的腳本,一般來說,對于企業(yè)環(huán)境,需要管理的環(huán)境比較復(fù)雜,這樣一個(gè)腳本管理所有的各個(gè)方面比較不易管理,首先就是版 本的變更/卸載等操作,以及不同的部門可能需要不同的腳本控制不同環(huán)境,雖然可以使用腳本語句達(dá)到對語句變更控制(sed等),但是畢竟復(fù)雜而且不易讀。
比如這里有一個(gè)管理多個(gè)學(xué)校的具體例子,一個(gè)學(xué)校使用KidPix 4, 這樣我們需要一個(gè)登錄腳本來重定向KidPix 4的用戶目錄到用戶本身的目錄下面,而另一個(gè)學(xué)校不使用KidPix, 而是需要一個(gè)公用的本地目錄,這樣每個(gè)學(xué)校的登錄腳本會(huì)不一樣,在更新等管理操作中會(huì)比較麻煩。
所以,我們使用這種方法來使問題簡單化,也就是把所有的管理不同問題的Login/Logout腳本都單獨(dú)生成一個(gè)shell腳本,并統(tǒng)一放在一個(gè)目錄下面,而上面的loginhook.sh和logouthook.sh就是一個(gè)調(diào)度程序,用它來依次調(diào)用所有的這些真正的管理腳本。這樣管理對于版本和卸載安裝都是比較容易的了。
下面是一個(gè)簡單化了調(diào)度腳本的主要部分:
USERNAME="$1"
SCRIPT_FOLDER="/var/root/LoginHook/Login"
SCRIPTS= `ls $SCRIPT_FOLDER`
for ONESCRIPT in SCRIPTS; do
if [[ -x "$HOOK_SCRIPTS_FOLDER/$ONEFILE" ]]; then
# execute the script if it is executable
"$HOOK_SCRIPTS_FOLDER/$ONEFILE" "$USERNAME"
fi
done
參考:
Mac OS X: Creating a login hook: http://support.apple.com/kb/HT2420?viewlocale=en_US
Running shell scripts at login and logout: http://www.bombich.com/mactips/loginhooks.html
LoginHook MultiScript Manager: http://ps-enable.com/software/LoginHookMultiScriptManager0.9b.dmg/view
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
