Mac-Osx

在 Mac OS X 上掛載 EncFS 卷使用使用者帳戶工作,但使用 su 使用 root 失敗

  • October 27, 2010

我正在嘗試通過在 Mac OS X 上使用登錄/註銷掛鉤腳本自動掛載 EncFS 卷。這些腳本以 root 身份執行,並在使用者登錄或註銷時自動執行使用者定義的掛鉤。主要腳本在/usr/local/sbin和 被稱為loginhookand 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 -在腳本中使用。我懷疑這就是問題所在,但我對它是什麼感到困惑。

我在這裡做錯了什麼?

編輯:基於 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 可能會更好地解決這個問題……

引用自:https://serverfault.com/questions/194668