Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371020
  • 博文数量: 62
  • 博客积分: 1272
  • 博客等级: 中尉
  • 技术积分: 674
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-15 16:58
文章分类

全部博文(62)

文章存档

2017年(1)

2014年(16)

2012年(12)

2011年(27)

2010年(6)

我的朋友

分类: BSD

2011-04-30 20:57:43

 1316人阅读 评论(0) 收藏 举报


 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 LogoutHook /var/root/LogoutHook/logouthook.sh

 

    大功告成!

 

E. AppleScript的方案:

    使用AppleScrip同样可以完成自动运行程序,比如下面的例子,自动运行/Applicaions/TextEdit.app程序.

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

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

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

    使用方法就是:

  1. AddStartupItem "/Application/TextEdit.app"  

 

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

  1. tell application "System Events"  
  2.     set theItem to every login item whose path contains "TextEdit"  
  3.     delete theItem  
  4. 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



参考:

 

Login and Logout Hooks For OSX:

Mac OS X: Creating a login hook:

Running shell scripts at login and logout:
LoginHook MultiScript Manager:

阅读(2488) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~