Skip to content

Instantly share code, notes, and snippets.

@wwarriner
Last active February 19, 2024 23:05
Show Gist options
  • Save wwarriner/2872393c496caa0166e80f79e83963d4 to your computer and use it in GitHub Desktop.
Save wwarriner/2872393c496caa0166e80f79e83963d4 to your computer and use it in GitHub Desktop.
Linux Permission Interactions Test
#! /bin/bash
set -e
set -o pipefail
while getopts ":s:t:c" arg; do
case "${arg}" in
s)
s="${OPTARG}"
;;
t)
t="${OPTARG}"
;;
c)
c=1
;;
esac
done
if [ -z "${s}" ] || [ -z "${t}" ]; then
echo "Must have both (s)ource and (t)arget directories"
exit
fi
# THIS IS DANGEROUS
# if ! [ -z "${c}" ]; then
# rm -rf "${s}/test-permissions"
# rm -rf "${t}/test-permissions"*
# exit
# fi
SOURCE="${s}/test-permissions"; mkdir "$SOURCE"
# Set up $SOURCE_DIR
SOURCE_DIR="$SOURCE/A"
mkdir "$SOURCE_DIR" && chmod 777 "$SOURCE_DIR"
touch "$SOURCE_DIR/a.txt" && chmod 777 "$SOURCE_DIR/a.txt"
mkdir "$SOURCE_DIR/B" && chmod 777 "$SOURCE_DIR/B"
touch "$SOURCE_DIR/B/b.txt" && chmod 777 "$SOURCE_DIR/B/b.txt"
tree -gpu "$SOURCE"
run_experiment() {
SOURCE_DIR="$1"
TARGET="$2"
# exact recursive copy with attributes
# we need this to test `mv` later
SOURCE_DIR_FOR_MV="$SOURCE_DIR-for-mv"
cp -a "$SOURCE_DIR" "$SOURCE_DIR_FOR_MV"
# Set up $TARGET_DIR
TARGET_DIR="$TARGET/A"
HOSTNAME=$(hostname)
cp -r "$SOURCE_DIR" "$TARGET_DIR-cp"
cp -rp "$SOURCE_DIR" "$TARGET_DIR-cp-p"
mv "$SOURCE_DIR_FOR_MV" "$TARGET_DIR-mv"
scp -r "$HOSTNAME":"$SOURCE_DIR" "$TARGET_DIR-scp" 2>&1 >/dev/null
scp -rp "$HOSTNAME":"$SOURCE_DIR" "$TARGET_DIR-scp-p" 2>&1 >/dev/null
rsync -q -r "$HOSTNAME":"$SOURCE_DIR" "$TARGET_DIR-rsync"
rsync -q -rp "$HOSTNAME":"$SOURCE_DIR" "$TARGET_DIR-rsync-p"
module load rclone
rclone copy "$SOURCE_DIR" "$TARGET_DIR-rclone"
module unload rclone
mkdir "$TARGET/mkdir-A"
touch "$TARGET/touch-a"
# Display results
tree -gpu "$TARGET"
}
TARGET="${t}/test-permissions-setfacl-mask"; mkdir "$TARGET";
chmod 770 "$TARGET"; chmod g+s "$TARGET"
setfacl --set u::rwx,g::rwx,o::---,m:rw- "$TARGET"
setfacl -d --set u::rwx,g::rwx,o::---,m:rw- "$TARGET"
run_experiment "$SOURCE_DIR" "$TARGET"
TARGET="${t}/test-permissions-setfacl"; mkdir "$TARGET";
chmod 770 "$TARGET"; chmod g+s "$TARGET"
setfacl --set u::rwx,g::rwx,o::- "$TARGET"
setfacl -d --set u::rwx,g::rwx,o::- "$TARGET"
run_experiment "$SOURCE_DIR" "$TARGET"
TARGET="${t}/test-permissions"; mkdir "$TARGET";
chmod 770 "$TARGET"; chmod g+s "$TARGET"
run_experiment "$SOURCE_DIR" "$TARGET"
[user-owner@node ~]$ ./test-permissions.sh -s ~ -t dir-with-different-group-owner
/home/user-owner/test-permissions
[drwxrwxrwx user-owner user-owner ] A
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
2 directories, 2 files
dir-with-different-group-owner/test-permissions-setfacl-mask
[drwxrwS--- user-owner group-owner] A-cp
[-rwxrw---- user-owner group-owner] a.txt
[drwxrwS--- user-owner group-owner] B
[-rwxrw---- user-owner group-owner] b.txt
[drwxrwxrwx user-owner user-owner ] A-cp-p
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
[drwxrwxrwx user-owner user-owner ] A-mv
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
[drwxrwS--- user-owner group-owner] A-rclone
[-rw-rw---- user-owner group-owner] a.txt
[drwxrwS--- user-owner group-owner] B
[-rw-rw---- user-owner group-owner] b.txt
[drwxrwS--- user-owner group-owner] A-rsync
[drwxrwS--- user-owner group-owner] A
[-rwxrw---- user-owner group-owner] a.txt
[drwxrwS--- user-owner group-owner] B
[-rwxrw---- user-owner group-owner] b.txt
[drwxrwS--- user-owner group-owner] A-rsync-p
[drwxrwxrwx user-owner group-owner] A
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
[drwxrwxrwx user-owner group-owner] A-scp
[-rwxrw---- user-owner group-owner] a.txt
[drwxrwxrwx user-owner group-owner] B
[-rwxrw---- user-owner group-owner] b.txt
[drwxrwxrwx user-owner group-owner] A-scp-p
[-rwxrw---- user-owner group-owner] a.txt
[drwxrwxrwx user-owner group-owner] B
[-rwxrw---- user-owner group-owner] b.txt
[drwxrwS--- user-owner group-owner] mkdir-A
[-rw-rw---- user-owner group-owner] touch-a
19 directories, 17 files
dir-with-different-group-owner/test-permissions-setfacl
[drwxrws--- user-owner group-owner] A-cp
[-rwxrwx--- user-owner group-owner] a.txt
[drwxrws--- user-owner group-owner] B
[-rwxrwx--- user-owner group-owner] b.txt
[drwxrwxrwx user-owner user-owner ] A-cp-p
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
[drwxrwxrwx user-owner user-owner ] A-mv
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
[drwxrws--- user-owner group-owner] A-rclone
[-rw-rw---- user-owner group-owner] a.txt
[drwxrws--- user-owner group-owner] B
[-rw-rw---- user-owner group-owner] b.txt
[drwxrws--- user-owner group-owner] A-rsync
[drwxrws--- user-owner group-owner] A
[-rwxrwx--- user-owner group-owner] a.txt
[drwxrws--- user-owner group-owner] B
[-rwxrwx--- user-owner group-owner] b.txt
[drwxrws--- user-owner group-owner] A-rsync-p
[drwxrwxrwx user-owner group-owner] A
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
[drwxrwxrwx user-owner group-owner] A-scp
[-rwxrwx--- user-owner group-owner] a.txt
[drwxrwxrwx user-owner group-owner] B
[-rwxrwx--- user-owner group-owner] b.txt
[drwxrwxrwx user-owner group-owner] A-scp-p
[-rwxrwx--- user-owner group-owner] a.txt
[drwxrwxrwx user-owner group-owner] B
[-rwxrwx--- user-owner group-owner] b.txt
[drwxrws--- user-owner group-owner] mkdir-A
[-rw-rw---- user-owner group-owner] touch-a
19 directories, 17 files
dir-with-different-group-owner/test-permissions
[drwxrwsr-x user-owner group-owner] A-cp
[-rwxrwxr-x user-owner group-owner] a.txt
[drwxrwsr-x user-owner group-owner] B
[-rwxrwxr-x user-owner group-owner] b.txt
[drwxrwxrwx user-owner user-owner ] A-cp-p
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
[drwxrwxrwx user-owner user-owner ] A-mv
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
[drwxrwsr-x user-owner group-owner] A-rclone
[-rw-rw-r-- user-owner group-owner] a.txt
[drwxrwsr-x user-owner group-owner] B
[-rw-rw-r-- user-owner group-owner] b.txt
[drwxrwsr-x user-owner group-owner] A-rsync
[drwxrwsr-x user-owner group-owner] A
[-rwxrwxr-x user-owner group-owner] a.txt
[drwxrwsr-x user-owner group-owner] B
[-rwxrwxr-x user-owner group-owner] b.txt
[drwxrwsr-x user-owner group-owner] A-rsync-p
[drwxrwxrwx user-owner group-owner] A
[-rwxrwxrwx user-owner user-owner ] a.txt
[drwxrwxrwx user-owner user-owner ] B
[-rwxrwxrwx user-owner user-owner ] b.txt
[drwxrwxrwx user-owner group-owner] A-scp
[-rwxrwxr-x user-owner group-owner] a.txt
[drwxrwxrwx user-owner group-owner] B
[-rwxrwxr-x user-owner group-owner] b.txt
[drwxrwxrwx user-owner group-owner] A-scp-p
[-rwxrwxrwx user-owner group-owner] a.txt
[drwxrwxrwx user-owner group-owner] B
[-rwxrwxrwx user-owner group-owner] b.txt
[drwxrwsr-x user-owner group-owner] mkdir-A
[-rw-rw-r-- user-owner group-owner] touch-a
19 directories, 17 files
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment