Estou tentando montar automaticamente um volume EncFS usando scripts de login / logout no Mac OS X. Os scripts são executados como raiz e executam automaticamente ganchos definidos pelo usuário quando o usuário faz login ou logoff. Os scripts principais estão em /usr/local/sbin
e são chamados de loginhook
e logouthook
. Aqui está o script de login:
#!/bin/bash
LOCAL_HOOK="/Users/$1/.loginhook"
if [ -e "$LOCAL_HOOK" ]
then
su - $1 -c "bash $LOCAL_HOOK"
fi
O script está registrado para ser executado no login com:
sudo defaults write com.apple.loginwindow LoginHook /usr/local/sbin/loginhook
Definido pelo usuário .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
O redirecionamento para o comando security
é necessário, pois a saída normal vai para stdout, mas a senha vai para stderr e se parece com password: "mypass"
.
Se eu executar .localhook
da minha conta de usuário, o script funciona bem, mas se o script for executado a partir do script "pai" (que é executado como root) usando su
, obtenho uma senha em branco.
A depuração com bash -x
mostra que tudo é executado como deveria, mas o comando env
revela que o ambiente não é o mesmo de quando efetuo login, apesar de usar su -
no script . Eu suspeito que este é o lugar onde o problema está, mas estou perplexo quanto ao que é.
O que estou fazendo de errado aqui?
Edit: solução LaunchAgent baseada em informações de 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>