Here are the required scripts. Run them as `root`.
`users.txt` (example input)
```text
alice:devs
bob:ops
charlie:devs
```
`setup.sh` (Tasks 1-4)
```bash
#!/bin/bash
USERS_FILE="users.txt"
SHARED_DIR="/opt/shared"
STICKY_DIR="/opt/sticky_test"
# Task 1: Create users and groups
while IFS=: read -r user group; do
[[ -z "$user" || "$user" =~ ^# ]] && continue
groupadd -f "$group"
id "$user" &>/dev/null || useradd -m -g "$group" "$user"
done < "$USERS_FILE"
# Task 2: Configure per-user directories and permissions
while IFS=: read -r user group; do
[[ -z "$user" || "$user" =~ ^# ]] && continue
mkdir -p "/home/$user/project"
chown "$user":"$group" "/home/$user/project"
chmod 750 "/home/$user/project"
done < "$USERS_FILE"
# Task 3: Shared directory with setgid
mkdir -p "$SHARED_DIR"
groupadd -f sharedgrp
while IFS=: read -r user group; do
[[ -z "$user" || "$user" =~ ^# ]] && continue
usermod -aG sharedgrp "$user"
done < "$USERS_FILE"
chown root:sharedgrp "$SHARED_DIR"
chmod 2770 "$SHARED_DIR"
# Task 4: Directory with sticky bit
mkdir -p "$STICKY_DIR"
chown root:sharedgrp "$STICKY_DIR"
chmod 1770 "$STICKY_DIR"
```
`test.sh` (Task 5)
```bash
#!/bin/bash
USERS_FILE="users.txt"
SHARED_DIR="/opt/shared"
STICKY_DIR="/opt/sticky_test"
check() {
if eval "$2"; then
printf "%-35s | PASS\n" "$1"
else
printf "%-35s | FAIL\n" "$1"
fi
}
# Task 1 & 2: Verify users, groups, and permissions
while IFS=: read -r user group; do
[[ -z "$user" || "$user" =~ ^# ]] && continue
check "User $user exists" "id \"$user\" &>/dev/null"
check "Group $group exists" "getent group \"$group\" &>/dev/null"
check "Dir /home/$user/project" "[[ -d \"/home/$user/project\" ]]"
check "Ownership $user:$group" "[[ \"\$(stat -c '%U:%G' \"/home/$user/project\")\" == \"$user:$group\" ]]"
done < "$USERS_FILE"
# Task 3: Verify setgid and inheritance
check "Shared dir setgid bit" "[[ \"\$(stat -c '%a' \"$SHARED_DIR\")\" =~ ^2 ]]"
FIRST_USER=$(awk -F: 'NR==1 && !/^#/{print $1}' "$USERS_FILE")
su -c "touch \"$SHARED_DIR/test_file\"" "$FIRST_USER" 2>/dev/null
check "Setgid group inheritance" "[[ \"\$(stat -c '%G' \"$SHARED_DIR/test_file\")\" == \"sharedgrp\" ]]"
# Task 4: Verify sticky bit and deletion protection
check "Sticky dir bit set" "[[ \"\$(stat -c '%a' \"$STICKY_DIR\")\" =~ ^1 ]]"
SECOND_USER=$(awk -F: 'NR==2 && !/^#/{print $1}' "$USERS_FILE")
su -c "touch \"$STICKY_DIR/test_file\"" "$FIRST_USER" 2>/dev/null
su -c "rm -f \"$STICKY_DIR/test_file\"" "$SECOND_USER" 2>/dev/null
check "Sticky bit delete protection" "[[ -f \"$STICKY_DIR/test_file\" ]]"
# Cleanup test artifacts
rm -f "$SHARED_DIR/test_file" "$STICKY_DIR/test_file"
```