设为首页 收藏本站
查看: 1000|回复: 0

[经验分享] Mac OS X(L1-3): 登录/退出自动运行程序的设置

[复制链接]

尚未签到

发表于 2016-5-17 07:46:17 | 显示全部楼层 |阅读模式
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管理:
  这个是比较中规中举的设置方式,一般用户,只要是可以打开SystemPreferences中的Accounts那么就可以自己设置启动程序,如下图,有可能首先需要在左下角解锁才能变更选项,在左边的用户列表中选中用户自己,在右边会有LoginItems标签出现,进入后用户可以添加或者删除现在的Login Items. 而上面第一种方法设置的启动程序,也会在这个列表中列出来。

  
3. 高级操作:
  大家都知道,在OS X中的配置信息一般都储存在.plist文件中,就如同Windows的都储存在Registry里面一样,但是OS X的.plist文件可能比较分散,而且是分级的。
  就拿上面用户针对自己的环境的设置,都储存在该用户的Library文件夹中,具体说,上面的设置在/Users/用户名/Library/Preferences/com.apple.loginitems.plist文件中,如果用Property ListEditor查看,可以看到他们在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/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脚本的运行。
  
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 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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-217917-1-1.html 上篇帖子: mac 软件集 下篇帖子: iPhone OS和iPhone Simulator的Framework的区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表