我正在尝试使用 Mac OS X 上的登录/注销挂钩脚本自动挂载 EncFS 卷。这些脚本以 root 身份运行,并在用户登录或注销时自动运行用户定义的挂钩。主要脚本是 in和/usr/local/sbin
。以下是登录脚本:loginhook
logouthook
#!/bin/bash
LOCAL_HOOK="/Users/$1/.loginhook"
if [ -e "$LOCAL_HOOK" ]
then
su - $1 -c "bash $LOCAL_HOOK"
fi
该脚本已注册为在登录时执行:
sudo defaults write com.apple.loginwindow LoginHook /usr/local/sbin/loginhook
用户自定义.loginhook
:
ENCFS=/path/to/encfs
PWD=$(security find-generic-password -ga EncFS 2>&1 >/dev/null | cut -d'"' -f2)
echo $PWD | $ENCFS -S $HOME/.encrypted/Vault $HOME/Documents/Vault
该命令的重定向security
是必要的,因为正常输出转到 stdout,但密码转到 stderr 并且看起来像password: "mypass"
。
如果我.localhook
从我的用户帐户执行,脚本可以正常工作,但如果通过使用“父”脚本(以 root 身份运行)执行该脚本,su
我会得到一个空白密码。
使用调试bash -x
显示一切运行正常,但env
命令显示环境不是尽管使用了脚本,但结果和我登录时一样su -
。我怀疑问题就出在这里,但我不知道问题是什么。
我在这里做错了什么?
编辑:LaunchAgent 解决方案基于 Gordon Davisson 提供的信息。
encfsd.sh
:
#!/bin/bash
ENCFS="/path/to/encfs"
ENCDIR="$HOME/.encrypted/Vault"
DECDIR="$HOME/Documents/Vault"
function cleanup {
# Kill sleep command ($! is PID of last command launched in background)
kill $!
umount "$DECDIR"
exit
}
trap cleanup 1 2 3 6 15
security find-generic-password -ga EncFS 2>&1 >/dev/null | cut -d'"' -f2 | "$ENCFS" -S "$ENCDIR" "$DECDIR"
# Wait for exit
while true; do
# Sleeping ignores normal signals so start it in a subprocess and wait for it
sleep 3600 &
wait
done
~/Library/LaunchAgents/localhost.encfsd.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>KeepAlive</key>
<false/>
<key>Label</key>
<string>localhost.encfsd</string>
<key>LimitLoadToSessionType</key>
<string>Background</string>
<key>Program</key>
<string>/Users/asdf/bin/encfsd.sh</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
答案1
登录和 logouthook 脚本分别在用户会话之前和之后运行,而不是在会话内运行。我怀疑由于您的 loginhook 在用户会话开始之前运行,因此用户的钥匙串尚未解锁,因此您无法从中恢复密码。LaunchAgent 可能更适合这种情况...