Mac-Osx
在 Mac OS X 上掛載 EncFS 卷使用使用者帳戶工作,但使用 su 使用 root 失敗
我正在嘗試通過在 Mac OS X 上使用登錄/註銷掛鉤腳本自動掛載 EncFS 卷。這些腳本以 root 身份執行,並在使用者登錄或註銷時自動執行使用者定義的掛鉤。主要腳本在
/usr/local/sbin
和 被稱為loginhook
andlogouthook
。這是登錄腳本:#!/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 -
在腳本中使用。我懷疑這就是問題所在,但我對它是什麼感到困惑。我在這裡做錯了什麼?
編輯:基於 Gordon Davisson 資訊的 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 可能會更好地解決這個問題……