#!/bin/sh # This script mounts an gocryptfs filesystem, starts a shell in the mounted # directory, and then unmounts the filesystem when the shell exits. This is an # equivalent of the encfssh script by by David Rosenstrauch. canonicalize() { cd "$1" || return pwd } case $1 in "" | -h | --help) echo "Usage: gocryptfssh encrypted_directory [unencrypted-directory [-p]]" echo " -p mount the unencrypted directory as public" exit 1 ;; esac enc_dir=$1 unenc_dir_given=false mount_public=false if [ ! -z "$2" ]; then unenc_dir_given=true unenc_dir=$2 for arg in "$@" ; do if [ "$arg" = "-p" ]; then mount_public=true fi done [ -d "$unenc_dir" ] || mkdir -- "$unenc_dir" else unenc_dir=$(mktemp -d .XXXXXXXX) fi if [ ! -d "$enc_dir" ]; then mkdir -- "$enc_dir" fi enc_dir=$(canonicalize "$enc_dir") unenc_dir=$(canonicalize "$unenc_dir") options= if [ "$unenc_dir_given" = "true" ]; then if [ "$mount_public" = "true" ]; then options="-- -o allow_other" fi fi # Attach the directory and change into it if gocryptfs "$enc_dir" "$unenc_dir" $options; then :; else echo "gocryptfs failed" rmdir -- "$unenc_dir" exit 1 fi if ! [ "$unenc_dir_given" = "true" ]; then chmod 700 "$unenc_dir" fi echo "Directory is $unenc_dir" >&2 cd "$unenc_dir" || exit # Fall back to umount if fusermount is not available (e.g., on OS X) fuse_umount() { if command -v fusermount >/dev/null 2>&1; then fusermount -u "$@" else umount "$@" # MacOS case fi } # Honor the SHELL environment variable to select a shell to run "$SHELL"; retval=$? # ensure that this shell isn't itself holding the mounted directory open # ...but avoid terminating on failure, *or* causing a shellcheck warning for # failing to check exit status from cd. cd / ||: # if unmount fails, skip rmdir, always use exit status of failure fuse_umount "$unenc_dir" || exit if ! [ "$unenc_dir_given" = true ]; then rmdir -- "$unenc_dir" fi exit "$retval"