尝试在 LaunchAgent 中访问钥匙串密码时出现错误代码 9216
Error code 9216 when attempting to access keychain password in LaunchAgent
还有其他几个问题讨论了从 LaunchAgents 访问钥匙串。
其中一个关键点是 here where joensson 提到您需要在应用程序列表中设置 <SessionCreate>
。
我已经做到了,现在我的应用程序 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.ionic.python.ionic-fs-watcher.startup</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/IonicFSWatcher.app/Contents/MacOS/ionic-fs-watcher</string>
<string>--debug</string>
<string>/Users/timothy/ionicprotected</string>
<string>--scan</string>
</array>
<key>UserName</key>
<string>timothy</string>
<key>SessionCreate</key>
<true />
</dict>
</plist>
该应用是一个 python 应用程序,它是使用 pyinstaller, packaged using pkgbuild, and installed via the command line 创建的。
当从命令行 运行 时,应用程序 运行 正常。如果应用程序是第一次 运行,用户会收到允许访问钥匙串的提示,应用程序会从那里继续。
当它作为 LaunchAgent
启动时,我在尝试访问钥匙串时收到 return 代码 9216。这是我用来测试的确切命令序列:
# Window 1
sudo launchctl unload -w ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
sudo launchctl load -w ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
sudo launchctl debug system/com.ionic.python.ionic-fs-watcher.startup --stdout --stderr
# Window 2
sudo launchctl kickstart -k -p system/com.ionic.python.ionic-fs-watcher.startup
在 python 脚本中,我一直在通过 运行 一些子命令和捕获输出进行调试。
# OK
status, output = commands.getstatusoutput("security list-keychains")
logger.error("Keychain list :%s (retcode = %s)" % (
output, status
))
# OK
status, output = commands.getstatusoutput("security find-generic-password -a 'Ionic Security' ")
logger.error("Keychain list item :%s (retcode = %s)" % (
output, status
))
# Fails, with error code: 9216
# Prompts immediately when running from command line
status, output = commands.getstatusoutput("security find-generic-password -a 'Ionic Security' -g")
logger.error("Keychain access :%s (retcode = %s)" % (
output, status
))
该部分代码的输出如下所示:
# Correctly shows both keychains
ERROR:root:Keychain list : "/Users/timothy/Library/Keychains/login.keychain"
"/Library/Keychains/System.keychain" (retcode = 0)
# Correctly lists information about keychain item
ERROR:root:Keychain list item :keychain: "/Users/timothy/Library/Keychains/login.keychain"
<redacted>
# Fail
ERROR:root:Keychain access : (retcode = 9216)
这些相同的命令在命令行中运行良好,最后一个 (-g
) 导致允许访问钥匙串的提示。
我也尝试在 KeyChain Access
应用程序中打开 com.ionicsecurity.client.sdk
的条目,并设置 "Allow all applications to access this item" 单选按钮。这样做之后,从 cli 获取值不再导致提示 但 应用程序 return 出现相同的错误代码。
我搜索了有关错误代码 9216 的信息,但没有找到任何结果。 运行 通过 security errors
实用程序的代码只给出
$ security error 9216
Error: 0x00002400 9216 unknown error 9216=2400
任何关于在 运行作为 LaunchAgent 时如何让应用程序访问钥匙串的帮助将不胜感激!
问题是我用来启动 LaunchAgent 的域。我正在启动到根系统域,而不是启动到我为其设置 LaunchAgent 的用户的 gui 域。因为这个
- LaunchAgent 无法访问用户钥匙串(除非我以正在创建会话的用户身份请求命令 运行)
- LaunchAgent 无法向用户显示弹出窗口以请求访问钥匙串(我假设这就是我在这里收到奇怪错误代码的原因)
这是从我之前使用的命令(不工作)到我现在使用的命令(工作)的映射。这些命令假定我们为其安装 LaunchAgent 的用户也是当前用户。
激活代理
# Before
sudo launchctl load -w ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
# Now
launchctl enable user/`id -u`/com.ionic.python.ionic-fs-watcher.startup
launchctl bootstrap gui/`id -u` ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
停用代理程序
# Before
sudo launchctl unload -w ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
# Now
launchctl bootout gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
launchctl disable user/`id -u`/com.ionic.python.ionic-fs-watcher.startup
设置 LaunchAgent 定义(plist 文件)的权限
# Before
chown root:wheel ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
chmod 644 ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
# Now
chown "`id -un`":"`id -gn`" ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
chmod 644 ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
LaunchAgent plist 文件内容
不需要 UserName
和 SessionCreate
块。
<?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.ionic.python.ionic-fs-watcher.startup</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/IonicFSWatcher.app/Contents/MacOS/ionic-fs-watcher</string>
<string>/Users/timothy/ionicprotected</string>
<string>--scan</string>
</array>
</dict>
还有其他几个问题讨论了从 LaunchAgents 访问钥匙串。
其中一个关键点是 here where joensson 提到您需要在应用程序列表中设置 <SessionCreate>
。
我已经做到了,现在我的应用程序 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.ionic.python.ionic-fs-watcher.startup</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/IonicFSWatcher.app/Contents/MacOS/ionic-fs-watcher</string>
<string>--debug</string>
<string>/Users/timothy/ionicprotected</string>
<string>--scan</string>
</array>
<key>UserName</key>
<string>timothy</string>
<key>SessionCreate</key>
<true />
</dict>
</plist>
该应用是一个 python 应用程序,它是使用 pyinstaller, packaged using pkgbuild, and installed via the command line 创建的。
当从命令行 运行 时,应用程序 运行 正常。如果应用程序是第一次 运行,用户会收到允许访问钥匙串的提示,应用程序会从那里继续。
当它作为 LaunchAgent
启动时,我在尝试访问钥匙串时收到 return 代码 9216。这是我用来测试的确切命令序列:
# Window 1
sudo launchctl unload -w ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
sudo launchctl load -w ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
sudo launchctl debug system/com.ionic.python.ionic-fs-watcher.startup --stdout --stderr
# Window 2
sudo launchctl kickstart -k -p system/com.ionic.python.ionic-fs-watcher.startup
在 python 脚本中,我一直在通过 运行 一些子命令和捕获输出进行调试。
# OK
status, output = commands.getstatusoutput("security list-keychains")
logger.error("Keychain list :%s (retcode = %s)" % (
output, status
))
# OK
status, output = commands.getstatusoutput("security find-generic-password -a 'Ionic Security' ")
logger.error("Keychain list item :%s (retcode = %s)" % (
output, status
))
# Fails, with error code: 9216
# Prompts immediately when running from command line
status, output = commands.getstatusoutput("security find-generic-password -a 'Ionic Security' -g")
logger.error("Keychain access :%s (retcode = %s)" % (
output, status
))
该部分代码的输出如下所示:
# Correctly shows both keychains
ERROR:root:Keychain list : "/Users/timothy/Library/Keychains/login.keychain"
"/Library/Keychains/System.keychain" (retcode = 0)
# Correctly lists information about keychain item
ERROR:root:Keychain list item :keychain: "/Users/timothy/Library/Keychains/login.keychain"
<redacted>
# Fail
ERROR:root:Keychain access : (retcode = 9216)
这些相同的命令在命令行中运行良好,最后一个 (-g
) 导致允许访问钥匙串的提示。
我也尝试在 KeyChain Access
应用程序中打开 com.ionicsecurity.client.sdk
的条目,并设置 "Allow all applications to access this item" 单选按钮。这样做之后,从 cli 获取值不再导致提示 但 应用程序 return 出现相同的错误代码。
我搜索了有关错误代码 9216 的信息,但没有找到任何结果。 运行 通过 security errors
实用程序的代码只给出
$ security error 9216
Error: 0x00002400 9216 unknown error 9216=2400
任何关于在 运行作为 LaunchAgent 时如何让应用程序访问钥匙串的帮助将不胜感激!
问题是我用来启动 LaunchAgent 的域。我正在启动到根系统域,而不是启动到我为其设置 LaunchAgent 的用户的 gui 域。因为这个
- LaunchAgent 无法访问用户钥匙串(除非我以正在创建会话的用户身份请求命令 运行)
- LaunchAgent 无法向用户显示弹出窗口以请求访问钥匙串(我假设这就是我在这里收到奇怪错误代码的原因)
这是从我之前使用的命令(不工作)到我现在使用的命令(工作)的映射。这些命令假定我们为其安装 LaunchAgent 的用户也是当前用户。
激活代理
# Before
sudo launchctl load -w ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
# Now
launchctl enable user/`id -u`/com.ionic.python.ionic-fs-watcher.startup
launchctl bootstrap gui/`id -u` ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
停用代理程序
# Before
sudo launchctl unload -w ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
# Now
launchctl bootout gui/`id -u`/com.ionic.python.ionic-fs-watcher.startup
launchctl disable user/`id -u`/com.ionic.python.ionic-fs-watcher.startup
设置 LaunchAgent 定义(plist 文件)的权限
# Before
chown root:wheel ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
chmod 644 ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
# Now
chown "`id -un`":"`id -gn`" ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
chmod 644 ~/Library/LaunchAgents/com.ionic.python.ionic-fs-watcher.startup.plist
LaunchAgent plist 文件内容
不需要 UserName
和 SessionCreate
块。
<?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.ionic.python.ionic-fs-watcher.startup</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/IonicFSWatcher.app/Contents/MacOS/ionic-fs-watcher</string>
<string>/Users/timothy/ionicprotected</string>
<string>--scan</string>
</array>
</dict>