OS X: 用脚本定时登录Mac电脑


远程登录:

大家知道有时为了管理/测试方便,比如测试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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用crontab来实现定时启动Mac上的程序。 你可以在终端中输入 crontab -e 命令,然后在文本编辑器中输入以下内容: * * * * * /path/to/program这将在每分钟都运行/path/to/program。你也可以根据自己的需要更改运行时间,例如每小时运行一次,每天运行一次等等。 ### 回答2: 要编写一个Python脚本,用于定时启动Mac上的程序,可以使用Python的内置模块`os`和`time`来实现。下面是一个简单的示例代码: ```python import os import time def start_program(program_path, delay): # 等待指定的延迟时间 time.sleep(delay) # 使用os模块执行命令,启动指定路径下的程序 os.system(f"open {program_path}") if __name__ == "__main__": # 设置程序路径和延迟时间 program_path = "/Applications/TextEdit.app" # 修改为要启动的程序的实际路径 delay = 10 # 延迟时间,单位为秒 # 调用函数启动程序 start_program(program_path, delay) ``` 在上面的示例代码中,`start_program`函数接受两个参数:`program_path`指定要启动的程序路径,`delay`表示延迟时间,即脚本运行后等待一段时间再启动程序。这里使用`time.sleep`函数来实现延迟。 在`start_program`函数中,使用`os.system`函数执行命令`open`来启动指定路径下的程序。这个示例中使用的是TextEdit.app作为示例,你可以根据需要修改`program_path`为你想要启动的程序的实际路径。 最后,在`if __name__ == "__main__":`语句中,设置了程序路径和延迟时间,并调用`start_program`函数来启动程序。 你可以将以上代码保存为一个Python脚本文件,比如`start_program.py`,然后在终端中运行该脚本(例如`python start_program.py`),程序将在延迟时间后启动。 ### 回答3: 要编写一个 Python 脚本定时启动 Mac 上的程序,可以使用 `os` 模块来执行系统命令。以下是一个实例: ```python import os import time def start_program(): program_path = "/Applications/Calculator.app" # 替换为要启动的程序的路径或命令 os.system(f"open {program_path}") def main(): interval = 3600 # 以秒为单位设置时间间隔,这里设置为一小时 while True: start_program() time.sleep(interval) if __name__ == "__main__": main() ``` 在上面的例子中,`start_program` 函数用来启动指定的程序。你需要将 `program_path` 变量替换为实际程序的路径或命令。例如,这里我用的是计算器应用程序。 `main` 函数会在一个死循环中定时调用 `start_program` 函数。时间间隔可以通过 `interval` 变量来调整,这里设置为一个小时(3600秒)。 这个脚本会不断地启动程序,然后等待指定的时间间隔后再次启动。可以使用 `Ctrl + C` 组合键来中断脚本的运行。 请注意,为了能够在 Mac 上执行该脚本,你需要安装 Python,然后通过终端运行该脚本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值