Назад | Перейти на главную страницу

Смонтировать том EncFS в Mac OS X работает от учетной записи пользователя, но не работает с root с помощью su

Я пытаюсь автоматически смонтировать том EncFS, используя сценарии подключения / выхода из системы в Mac OS X. Сценарии запускаются от имени пользователя root и автоматически запускают определенные пользователем хуки при входе или выходе пользователя. Основные скрипты находятся в /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 команда необходима, так как нормальный вывод идет на стандартный вывод, но пароль идет на стандартный поток и выглядит как password: "mypass".

Если я выполню .localhook из моей учетной записи пользователя сценарий работает нормально, но если сценарий запускается из «родительского» сценария (который запускается от имени пользователя root), используя su Я получаю пустой пароль.

Отладка с bash -x показывает, что все работает как надо, но env команда показывает, что среда не так же, как когда я вхожу в систему, хотя su - в сценарии. Я подозреваю, что здесь проблема, но я не понимаю, что это такое.

Что я здесь делаю не так?

Изменить: решение LaunchAgent на основе информации от Гордона Дэвиссона.

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>

Сценарии входа в систему и выхода из системы выполняются до и после (соответственно) пользовательского сеанса, а не внутри сеанса. Я подозреваю, что, поскольку ваш логин-крючок запущен до начала пользовательского сеанса, связка ключей пользователя еще не была разблокирована, поэтому вы еще не можете восстановить пароли от нее. Для этого лучше подойдет LaunchAgent ...