您的位置:首页 > 其它

Mac OS X: 登录/退出自动运行程序的设置

2010-12-27 21:40 344 查看
Update:

2009-02-22: 添加了E.AppleScript的部分

简介:本文介绍了普通用户如何设置启动程序,后面针对高级用户或者管理员讨论了4种不同的设定启动程序的方法,一种设置退出程序运行的方法,并初步讨论了对于企业用户需要考虑的一些方面,和多重启动程序的shell脚本的管理。

介绍几个简单的方法,其中1和2适用于普通/入门级用户,后面的3适合于管理员或者高级用户,而4讨论了适合于企业管理员的管理方式,供参考。

Update History:

2009-02-14:

Initial

2009-02-15:

1. 题目的变更

2. 更改了一个错误:3.A中的不是loginwindow.plist 而是loginitems.plist文件。

3. 一些措词的变化和前言

我们知道,在Windows里面,普通用户可以通过把程序或者是快捷方式复制到自己的Programs/Startup目录中就在以后登录系统时,让Windows自动执行那个程序,而且管理员也可以通过Group Policy等方式强迫程序运行。

在OS X中,对于普通用户,操作也是非常简单的,而且可以通过多个途径进行设置管理。

下面介绍几个简单的方法,其中1和2适用于普通/入门级用户,后面的3适合于管理员或者高级用户,而4讨论了适合于企业级管理员的管理方式,供参考。

1. 最简单的方法就是,当用户在Dock上的一个图标上按住鼠标不动,那么就会弹出一个菜单,其中一项就是"Open at Login", 只要是选择上,那么这个程序就会在该用户下次登录时自动运行,大家不妨试试。



2. 通过Account管理:

这个是比较中规中举的设置方式,一般用户,只要是可以打开System Preferences中的Accounts那么就可以自己设置启动程序, 如下图,有可能首先需要在左下角解锁才能变更选项,在左边的用户列表中选中用户自己,在右边会有Login Items标签出现,进入后用户可以添加或者删除现在的Login Items. 而上面第一种方法设置的启动程序,也会在这个列表中列出来。



3. 高级操作:

大家都知道,在OS X中的配置信息一般都储存在.plist文件中,就如同Windows的都储存在Registry里面一样,但是OS X的.plist文件可能比较分散,而且是分级的。

就拿上面用户针对自己的环境的设置,都储存在该用户的Library文件夹中,具体说,上面的设置在/Users/用户名/Library /Preferences/com.apple.loginitems.plist文件中,如果用Property List Editor查看,可以看到他们在SessionItems->CustomListItems里面。这些设置只是针对该用户起作用,而且运行权限是该用户所拥有的权限。

对于管理员来说,不会为每一个用户单独设置这些启动选项,而且这些选项对于该用户是可以改动的,无法做到强制执行,所以管理员要对所有用户进行设置。这一般有四种方法:

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/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"

这样你的脚本就可以运行了,应该说这种方法只适用于shell脚本的运行。

D. Login/Logout Hook:

这个方法功能比上面的都强,因为它可以支持退出(Logout)的控制,上面的方法都只是对登录(Login)自动运行的控制,无法控制退出进程,而都是由loginwindow进程/程序来自动管理,这样对于要求在用户退出前需要进行清除步骤的,上面的方法都无法实现(当然了如果可以花费更多时间编写daemons,当然可以完成相关操作),而这个方法提供一个简单的接口。

这种方法 shell脚本运行root用户的权限,这给管理员最大的自由度,而且对于一般用户比较隐蔽,而且也无法查看或者变更。

下面的操作都在root用户里面执行,所以:

sudo -s

cd /var/root/

首先创建一个脚本文件,比如/var/root/LoginHook/loginhook.sh和logouthook.sh

然后不能忘记设置可执行属性:

chmod u+x /var/root/LoginHook/loginhook.sh

chmod u+x /var/root/LoginHook/logouthook.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同样可以完成自动运行程序,比如下面的例子,自动运行/Applicaions/TextEdit.app程序.

view plaincopy to clipboardprint?
/usr/bin/osascript -e 'tell application "System Events" to make new login item with properties { path: "/Applications/TextEdit.app", hidden:false } at end'
/usr/bin/osascript -e 'tell application "System Events" to make new login item with properties { path: "/Applications/TextEdit.app", hidden:false } at end'

如果希望更加通用的程序,可以使用下面的变化,比如保存为AddStarupItem:

view plaincopy to clipboardprint?
#!/bin/bash
/usr/bin/osascript -e "tell application /"System Events/" to make new login item with properties { path: /"$1/", hidden:false } at end"
#!/bin/bash
/usr/bin/osascript -e "tell application /"System Events/" to make new login item with properties { path: /"$1/", hidden:false } at end"

使用方法就是:

view plaincopy to clipboardprint?
AddStartupItem "/Application/TextEdit.app"
AddStartupItem "/Application/TextEdit.app"

利用AppleScript还可以自动删除一个自动运行程序, 比如:

view plaincopy to clipboardprint?
tell application "System Events"
set theItem to every login item whose path contains "TextEdit"
delete theItem
end tell
tell application "System Events"
set theItem to every login item whose path contains "TextEdit"
delete theItem
end tell

4. 进一步的考虑:
最后我们来进一步改进上面3.D里面的脚本,一般来说,对于企业环境,需要管理的环境比较复杂,这样一个脚本管理所有的各个方面比较不易管理,首先就是版本的变更/卸载等操作,以及不同的部门可能需要不同的脚本控制不同环境,虽然可以使用脚本语句达到对语句变更控制(sed等),但是毕竟复杂而且不易读。
比如这里有一个管理多个学校的具体例子,一个学校使用KidPix 4, 这样我们需要一个登录脚本来重定向KidPix 4的用户目录到用户本身的目录下面,而另一个学校不使用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

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/afatgoat/archive/2009/02/15/3892291.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐