Загрузка данных


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"
```