O volume do EncFS no Mac OS X funciona a partir da conta do usuário, mas falha com o root usando o su

2

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>
    
por Bjørn Olav Ruud 25.10.2010 / 23:22

1 resposta

1

Os scripts de login e logouthook são executados antes de & após (respectivamente) a sessão do usuário, não dentro da sessão. Eu suspeito que desde que seu loginhook está rodando antes do início da sessão do usuário, o conjunto de chaves do usuário ainda não foi desbloqueado, então você não pode recuperar senhas dele ainda. Um LaunchAgent pode funcionar melhor para isso ...

    
por 26.10.2010 / 04:27