A. 如果没有特殊的权限要求,那么可以通过添加项目到/Library/Preferences/com.apple.loginitems.plist(loginwindow.plist)文件中的键值privilegedlist->CustomListItems下面的方法来实现。具体的键值内容可以参见用户底下的loginitems.plist文件的设置内容。
B. 或者通过生成一个可执行文件plist控制文件,并把它放置在/Library/LaunchAgents里面,也可以达到自动运行的效果,但是这个程序是以root用户权限运行的。(其实严格来说这个方法不属于login/logout hook)
C. 第一种LoginHook:
如果你的系统版本是Mac OS X 10.2.x, 10.3.x, or 10.4.2,那么可以使用这个方法。
打开/etc/ttys文件,找到下面的一命令行: #console"/System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow"vt100 on secure window=/System/Library/CoreServices/WindowServeronoption="/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"
这样你的脚本就可以运行了,应该说这种方法只适用于shell脚本的运行。
E. AppleScript的方案:
使用AppleScrip同样可以完成自动运行程序,比如下面的例子,自动运行/Applicaions/TextEdit.app程序.
/usr/bin/osascript -e 'tell application "System Events" to make new login item with properties { path: "/Applications/TextEdit.app", hidden:false } at end'
如果希望更加通用的程序,可以使用下面的变化,比如保存为AddStarupItem:
#!/bin/bash/usr/bin/osascript -e "tell application /"System Events/" to make new login item with properties { path: /"$1/", hidden:false } at end"
使用方法就是:
AddStartupItem "/Application/TextEdit.app"
利用AppleScript还可以自动删除一个自动运行程序, 比如:
tell application "System Events"set theItem to every login item whose path contains "TextEdit"delete theItemend tell
4. 进一步的考虑:
最后我们来进一步改进上面3.D里面的脚本,一般来说,对于企业环境,需要管理的环境比较复杂,这样一个脚本管理所有的各个方面比较不易管理,首先就是版本的变更/卸载等操作,以及不同的部门可能需要不同的脚本控制不同环境,虽然可以使用脚本语句达到对语句变更控制(sed等),但是毕竟复杂而且不易读。
比如这里有一个管理多个学校的具体例子,一个学校使用KidPix 4, 这样我们需要一个登录脚本来重定向KidPix4的用户目录到用户本身的目录下面,而另一个学校不使用KidPix,而是需要一个公用的本地目录,这样每个学校的登录脚本会不一样,在更新等管理操作中会比较麻烦。
所以,我们使用这种方法来使问题简单化,也就是把所有的管理不同问题的Login/Logout脚本都单独生成一个shell脚本,并统一放在一个目录下面,而上面的loginhook.sh和logouthook.sh就是一个调度程序,用它来依次调用所有的这些真正的管理脚本。这样管理对于版本和卸载安装都是比较容易的了。
下面是一个简单化了调度脚本的主要部分: 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