远程登录:
大家知道有时为了管理/测试方便,比如测试AD用户登录配置是否正确,需要登录到众多电脑上,使用下面的代码可以通过ARD等方式,使远程电脑自动登录到指定的用户username。
osascript <<EOT
tell application "System Events" to keystroke "$username"
tell application "System Events" to delay 2
tell application "System Events" to keystroke tab
tell application "System Events" to delay 2
tell application "System Events" to keystroke "$password"
tell application "System Events" to delay 2
tell application "System Events" to keystroke return
EOT
定时登录需求:
如果需求是无人职守地定时让系统自动登录,以便进行特定的管理操作,那么上面的代码无法执行。而为什么ARD可以成功呢?因为,在你从ARD发送Unix命令的时候,选择了用户root,也就是说使用root的用户环境来执行该命令。
因为普通的Unix命令无法访问GUI程序的安全环境/名字空间,除非在执行该GUI程序的相同用户环境里。如果需要使用脚本的方式在无用户登录的时候,访问LoginWindow,就需要使用特殊的命令。
重写脚本:
launchctl bsexec <PID> <command and args>命令就是通过该进程的PID,使用其它的用户环境执行后面的命令。
于是可以将上面的命令改写如下:
#!/bin/sh
USERNAME="username"
PASSWORD="passsword"
logger "AutoLogin Start…."
sleep 3
PID=`ps -ax | grep loginwindow.app | grep -v grep | tail -n 1 | awk '{print $1}'`
launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke \"\""
launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke \"$USERNAME\""
sleep 2
launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke return"
sleep 2
launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke \"$PASSWORD\""
sleep 2
launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke return"
logger "AutoLogin End…."
exit 0
这样就可以在无人登录的时候访问LoginWindow,并对它输入字符串。
定时机制:
定时运行机制,还是使用Launch daemon来完成的好。
问题的关键就是使用Launch服务提供的定时执行的参数,StartCalendarInterval,定义好自己使用的时间。
下面是一个例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>54</integer>
<key>Hour</key>
<integer>9</integer>
</dict>
<key>UserName</key>
<string>root</string>
<key>Label</key>
<string>edu.ts.AutoLogin</string>
<key>ProgramArguments</key>
<array>
<string>/Library/Adminscripts/AutoLogin.sh</string>
</array>
<key>LaunchOnlyOnce</key>
<false/>
<key>RunAtLoad</key>
<false/>
<key>ServiceDescription</key>
<string>Auto Login Test</string>
</dict>
</plist>
实际环境:
实际环境中,可能遇到很多问题,使得上面的脚本无法正常运行。下面时比较常见的两个:
- 屏幕保护程序: 如果在执行上面的脚本时,屏幕保护程序在运行,那么它会吃掉部分字符。
- 登录窗口:登录窗口需要是显示用户名和密码,不是用户列表。(Display login window as Name and password);其次,当前光标应该在Username处,否则也是不工作。
所以,处理好这些"意外"是保证脚本顺利成功的条件。最简单的方法就是设置好后重新启动电脑。
安全问题:
因为该脚本中使用明码,所以可能导致安全隐患。
其它方法:
另外一个可能的方法是,在一台机器上设置好自动登录后,得到/etc/kcpassword文件,里面的密码是加密的,然后设置com.apple.loginwidnow中的autoLoginUser,这样可以让系统在重新启动后自动登录,把所有这些打成pkg包,使用一个方式定时发布到客户端。
在此感谢Mike Lynn的帮助
Tony Liu
分享到:
相关推荐
Mac OS X提供了对诸多脚本语言的支持。无论是UNIX环境中常用的各类脚本,还是新兴的Ruby、Python等脚本语言,还有苹果所特有简单易学的AppleScript,这些都为Power User们更加灵活高效地驾驭操作系统提供了方便。...
MikroTik RouterOS脚本生成器(ROS 5.X-6.X代码生成)是一种基于Linux V2.6内核的路由操作系统,可以生成ROS 5.X-6.X代码,可以直接把普通的电脑编程专业的路由器。通过这款MikroTik RouterOS脚本生成器能够非常方便快捷...
定时关机脚本,定时关机脚本,定时关机脚本,定时关机脚本。
RouterOS脚本生成器 5.X-6.X Ver2.9 用这个制作脚本很方便
自动打开网页脚本dat,window定时执行脚本,通过Windows定时任务,选择该文件可以定时打开指定的网站,用于定时唤醒网站
RouterOS脚本生成器+5.X-6.X+Ver2.11.zip
router os命令 一些常用脚本 router os命令 一些常用脚本
右击用记事本打开,修改对应的文件路径、脚本名称,即可定时运行Jmeter脚本
脚本和工具的集合,以协助使用Nagios监视Mac OS X和基本服务。 在我的网站上的帖子中可以找到很多这样的概述和用例: : 这些脚本的一些功能包括: 使用Time Machine,CrashPlan和Carbon Copy Cloner检查备份的...
linux oracle 定时 导出脚本;
用VBS写的简单的电脑mac地址查看工具。
不过OSX平台使用的是很特别的Objective-C而非常规的C/C++,这使得很多开发人员对Mac OS X平台的开发有些望而却步,因此学习Objective-C以及Mac平台下的开发工具就显得相当重要了。因此,我挑选了一些相对比较新Mac ...
RouterOS精华教程中的经典防火墙脚本
技巧高超的Shell脚本 101个Linux_Mac OS X_Unix系统的脚本.zip
shell脚本定时清理linux清理内存脚本,放置linux内存过高使用
RouterOS脚本生成器 5.X-
postgresql数据库定时备份脚本(linux),亲测可用总结
linux常用定时日志清理脚本,一些应用服务器长年累积日志量庞大,用这个定时任务清理指定日志类文件。参考下吧~
RouterOS PCC负载脚本
定时关闭window脚本