您的位置:首页 > 其它

Mac OS X(L1-3): 登录/退出自动运行程序的设置

2009-02-15 13:00 375 查看
Mac OS X: 登录/退出自动运行程序的设置

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程序.

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

参考:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: