LaunchAgent 脚本在用户输入窗口 OS X Safari 处停止
Posted
技术标签:
【中文标题】LaunchAgent 脚本在用户输入窗口 OS X Safari 处停止【英文标题】:LaunchAgent Script stops at user input window OS X Safari 【发布时间】:2015-03-26 03:28:53 【问题描述】:我正在尝试为极端的计算机新手用户设置 Mac,以便一切都准备就绪,除了他们的用户帐户。
这样做的问题是,如果不访问用户帐户,例如 Safari 扩展程序,安装起来非常困难。我已经设置了 Chrome 和 Firefox - 我想为它们安装一些基础知识,甚至在它们第一次加载时单击安装按钮也会让人们感到困惑,我希望它完全放手。
我正在尝试安装 Adblocker。到目前为止,我得到了它,因此脚本在从终端运行时可以完美运行,但是当作为 LaunchAgent 运行时,它会在 Safari 上获得需要用户输入并停止的安装扩展窗口。
它不应该停止,因为最初我让 AppleScript 单击菜单,然后我决定在键盘上启用完整的选项卡控制,并让 cliclick 按选项卡和空格(用户可以)也安装了。
正如我所提到的,作为脚本运行,这可以完美运行,但由于某种原因,当 Launchagent 在登录时运行它时,脚本会在扩展安装窗口出现后立即停止。
这是一个错误,它是一个极端的安全功能吗?如果弹出窗口,我是否必须调整我的 plist 以告诉 Launchagent 不要更改脚本的工作方式,我是否需要在脚本中添加更多内容才能让它在由 launchd 运行时表现不同?
这里是主要部分,改编自bits online。
# HARDCODED VALUE FOR "PATHTOEXTENSION" IS SET HERE
pathToExtension="/ext/safari.safariextz"
# CHECK TO SEE IF A VALUE WAS PASSED IN PARAMETER 4 AND, IF SO, ASSIGN TO "PATHTOEXTENSION"
if [ "$4" != "" ] && [ "$pathToExtension" == "" ];then
pathToExtension=$4
fi
# Error if variable appName is empty
if [ "$pathToExtension" == "" ]; then
echo "Error: No value was specified for the pathToExtension variable..."
exit 1
fi
# Turn on full tab control for keyboard
defaults write NSGlobalDomain AppleKeyboardUIMode -int 3
### Launch Safari if not open
osascript -e 'tell application "Safari"
activate
end tell'
### Prompt the user to install the extension given @ $4
osascript -e 'tell application "Safari"
open "'"$pathToExtension"'"
tell application "System Events"
tell process "Safari"
set frontmost to true
end tell
end tell
end tell'
#Run cliclick to press tab and space on the keyboard to install extension
sleep 0.7s
cliclick kp:tab kp:space
### Close Safari
osascript -e 'tell application "System Events"
if ((name of processes) contains "Safari") then
tell application "Safari" to quit
end if
end tell'
### Open Getting Started PDF
osascript -e 'tell application "Preview"
open "/Applications/Tutorials/Quick Start Guide.pdf"
end tell'
### Cleanup - delete launch agent so it doesn't run on next boot
rm ~/Library/LaunchAgents/com.ext.install.plist
### Exit silently, as will error if exists & if times out for whatever reason
exit 0
运行脚本的 plist 是这样的......
<?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>Label</key>
<string>com.ext.install</string>
<key>Nice</key>
<integer>20</integer>
<key>ProcessType</key>
<string>Interactive</string>
<key>ProgramArguments</key>
<array>
<string>/Users/Shared/install-ext.command</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/com.ext.install.err</string>
<key>StandardOutPath</key>
<string>/tmp/com.rxt.install.out</string>
</dict>
</plist>
顺便说一下,日志中没有报告错误。希望有人能提供一些见解。
【问题讨论】:
我似乎总是问没有人能回答的问题:/ 【参考方案1】:保存这个:
install-ext.command
# HARDCODED VALUE FOR "PATHTOEXTENSION" IS SET HERE
pathToExtension="/Users/Shared/ext/wpa.safariextz"
# CHECK TO SEE IF A VALUE WAS PASSED IN PARAMETER 4 AND, IF SO, ASSIGN TO "PATHTOEXTENSION"
if [ "$4" != "" ] && [ "$pathToExtension" == "" ];then
pathToExtension=$4
fi
# Error if variable appName is empty
if [ "$pathToExtension" == "" ]; then
echo "Error: No value was specified for the pathToExtension variable..."
exit 1
fi
### Prompt the user to install the extension given @ $4
osascript -e 'tell application "Safari"
activate
open "'"$pathToExtension"'"
end tell
delay 2
tell application "System Events"
tell process "Safari"
click button "Install" of window 1
end tell
end tell'
### Exit silently, as will error if exists & if times out for whatever reason
exit 0
我告诉 Safari 点击安装按钮。而不是使用第三方应用。
对文件进行了修改以使其成为可执行文件。
按原样使用您的 LaunchAgent。
手动加载 LaunchAgent 运行代码。但不出所料,我也得到了授权install-ext.command控制计算机的提示。
所以我必须进行身份验证。那首先。
然后,LaunchAgent 的任何后续加载都按预期工作,包括登录时。
【讨论】:
嗨@markhunte - 感谢您的意见,我会试一试。您可以在这里用 cliclick 替换单击按钮的代码吗?好处是它不需要可访问性访问。这还不错,因为我认为我可以从管理员添加它,但为了安全起见,如果我不需要可访问性或 sudo 任何地方,这是最好的。 我也让它作为 LaunchAgent 工作!您距离在这里获得全部赏金只有一秒钟的时间:D - 您知道如何让“欢迎来到 Safari”页面再次出现在 Safari 中吗?我已经删除了每一个偏好,它再也不会回来了。它曾经是主要的 Safari plist,但在优胜美地似乎发生了变化。 @realdannys 我从未尝试过找回它。你如何删除首选项。您应该尝试在终端中使用defaults delete path/to/pref
删除它。
@realdannys 刚刚测试了defaults delete ~/Library/Preferences/com.apple.Safari.plist
,它有效。
啊,我正在对我能找到的所有 Safari 文件执行 rm -rf,而我所需要的就是这个!谢谢马克,你太棒了,这一切都很完美 - 我稍微减少了唤醒时间......我现在唯一的问题是脚本在启动时启动是否需要一段时间 - 如果用户开始点击它就会出现或使用不会启动脚本的计算机。有时脚本在登录菜单后直接运行,有时在启动之前有很长的延迟。以上是关于LaunchAgent 脚本在用户输入窗口 OS X Safari 处停止的主要内容,如果未能解决你的问题,请参考以下文章