Add comprehensive user management functionality

Features added:
- Create Samba users with password setup (user-create)
- List all Samba users (user-list)
- Delete Samba users with optional system user removal (user-delete)
- Configure share access for users interactively (user-access)
- Revoke user access from specific shares (user-revoke)
- Automatically creates system users if needed
- Interactive share selection for user permissions
- Disables guest access when users are assigned

User management includes:
- Password prompts for new users
- System user creation with no shell access
- Integration with pdbedit for user management
- Automatic valid_users configuration in smb.conf
- Backup creation before any configuration changes

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
mxnticek 2026-01-09 20:43:25 +01:00
parent 9c97169799
commit 74c2dd0daf
2 changed files with 290 additions and 2 deletions

View file

@ -80,6 +80,39 @@ sudo ./spravuj_sdileni.sh delete <share-name>
sudo ./spravuj_sdileni.sh auto-disks sudo ./spravuj_sdileni.sh auto-disks
``` ```
### User Management
**Create a new Samba user**:
```bash
sudo ./spravuj_sdileni.sh user-create [username]
```
This will:
- Create a system user if it doesn't exist (with no shell access)
- Prompt for a Samba password
- Optionally configure which shares the user can access
**List all Samba users**:
```bash
sudo ./spravuj_sdileni.sh user-list
```
**Configure share access for a user**:
```bash
sudo ./spravuj_sdileni.sh user-access [username]
```
Interactively select which shares the user can access.
**Revoke user access from a share**:
```bash
sudo ./spravuj_sdileni.sh user-revoke <username> <share-name>
```
**Delete a Samba user**:
```bash
sudo ./spravuj_sdileni.sh user-delete [username]
```
Optionally removes the system user as well.
## Share Types ## Share Types
The script creates different types of shares: The script creates different types of shares:

View file

@ -502,6 +502,236 @@ interactive_mount_and_create() {
create_share "$share_name" create_share "$share_name"
} }
# =============================================================================
# USER MANAGEMENT FUNCTIONS
# =============================================================================
# Funkce pro zobrazení všech Samba uživatelů
list_samba_users() {
echo "=== SEZNAM SAMBA UŽIVATELŮ ==="
if ! command -v pdbedit &> /dev/null; then
echo "Příkaz 'pdbedit' není k dispozici. Nemohu zobrazit uživatele."
return 1
fi
local users=$(pdbedit -L 2>/dev/null)
if [ -z "$users" ]; then
echo "Žádní Samba uživatelé nejsou nastaveni."
else
echo "$users"
fi
}
# Funkce pro vytvoření nového Samba uživatele
create_samba_user() {
local username="$1"
if [ -z "$username" ]; then
echo -n "Zadejte uživatelské jméno: "
read username
fi
if [ -z "$username" ]; then
echo "Chyba: Uživatelské jméno je povinné."
return 1
fi
# Zkontroluj jestli systémový uživatel existuje
if ! id "$username" &>/dev/null; then
echo "Systémový uživatel '$username' neexistuje."
read -p "Chcete vytvořit systémového uživatele? (Y/n): " -n 1 -r; echo
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
useradd -M -s /sbin/nologin "$username"
if [ $? -ne 0 ]; then
echo "Chyba: Nepodařilo se vytvořit systémového uživatele."
return 1
fi
echo "✅ Systémový uživatel '$username' byl vytvořen."
else
echo "Operace zrušena."
return 1
fi
fi
# Přidej uživatele do Samby
echo "Nastavte Samba heslo pro uživatele '$username':"
if smbpasswd -a "$username"; then
echo "✅ Samba uživatel '$username' byl úspěšně vytvořen."
# Nabídni možnost přiřadit přístup ke sdílením
echo ""
read -p "Chcete nastavit přístup ke sdílením? (Y/n): " -n 1 -r; echo
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
configure_user_shares "$username"
fi
else
echo "Chyba: Vytvoření Samba uživatele selhalo."
return 1
fi
}
# Funkce pro smazání Samba uživatele
delete_samba_user() {
local username="$1"
if [ -z "$username" ]; then
echo -n "Zadejte uživatelské jméno k odstranění: "
read username
fi
if [ -z "$username" ]; then
echo "Chyba: Uživatelské jméno je povinné."
return 1
fi
# Zkontroluj jestli Samba uživatel existuje
if ! pdbedit -L 2>/dev/null | grep -q "^$username:"; then
echo "Chyba: Samba uživatel '$username' neexistuje."
return 1
fi
echo "VAROVÁNÍ: Chystáte se odstranit Samba uživatele '$username'"
read -p "Jste si jistí? (y/N): " -n 1 -r; echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
if smbpasswd -x "$username"; then
echo "✅ Samba uživatel '$username' byl odstraněn."
read -p "Odstranit také systémového uživatele? (y/N): " -n 1 -r; echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
userdel "$username"
echo "✅ Systémový uživatel '$username' byl odstraněn."
fi
else
echo "Chyba: Odstranění Samba uživatele selhalo."
return 1
fi
else
echo "Operace zrušena."
fi
}
# Funkce pro nastavení přístupu uživatele ke sdílením
configure_user_shares() {
local username="$1"
if [ -z "$username" ]; then
echo -n "Zadejte uživatelské jméno: "
read username
fi
if [ -z "$username" ]; then
echo "Chyba: Uživatelské jméno je povinné."
return 1
fi
# Zkontroluj jestli Samba uživatel existuje
if ! pdbedit -L 2>/dev/null | grep -q "^$username:"; then
echo "Chyba: Samba uživatel '$username' neexistuje."
echo "Použijte 'user-create' pro vytvoření uživatele."
return 1
fi
check_config_exists
# Získej seznam sdílení
local shares=($(grep -E "^\[.*\]" "$CONFIG_FILE" | grep -v "\[global\]" | sed 's/\[\(.*\)\]/\1/'))
if [ ${#shares[@]} -eq 0 ]; then
echo "Žádná sdílení nejsou nakonfigurována."
return 1
fi
echo "=== NASTAVENÍ PŘÍSTUPU PRO UŽIVATELE '$username' ==="
echo "Dostupná sdílení:"
local i=1
for share in "${shares[@]}"; do
echo " $i) $share"
i=$((i+1))
done
echo ""
echo "Zadejte čísla sdílení oddělená mezerou (např: 1 3 4)"
echo -n "Nebo stiskněte Enter pro přístup ke všem: "
read selection
local selected_shares=()
if [ -z "$selection" ]; then
selected_shares=("${shares[@]}")
else
for num in $selection; do
if [[ "$num" =~ ^[0-9]+$ ]] && [ "$num" -ge 1 ] && [ "$num" -le ${#shares[@]} ]; then
selected_shares+=("${shares[$((num-1))]}")
fi
done
fi
if [ ${#selected_shares[@]} -eq 0 ]; then
echo "Žádná sdílení nebyla vybrána."
return 1
fi
echo ""
echo "Vytvářím zálohu..."
cp "$CONFIG_FILE" "$BACKUP_FILE"
# Přidej uživatele do valid users pro vybraná sdílení
for share in "${selected_shares[@]}"; do
echo "Přidávám přístup k sdílení: [$share]"
# Zkontroluj jestli sdílení má valid users
if grep -A 10 "^\[$share\]" "$CONFIG_FILE" | grep -q "^ valid users ="; then
# Přidej uživatele k existujícímu valid users
sed -i "/^\[$share\]/,/^\[/ s/^ valid users = \(.*\)/ valid users = \1 $username/" "$CONFIG_FILE"
else
# Přidej nový řádek valid users
sed -i "/^\[$share\]/a\ valid users = $username" "$CONFIG_FILE"
fi
# Vypni guest ok pokud je zapnutý
sed -i "/^\[$share\]/,/^\[/ s/^ guest ok = yes/ guest ok = no/" "$CONFIG_FILE"
done
echo "✅ Přístup nastaven pro sdílení: ${selected_shares[*]}"
}
# Funkce pro odebrání přístupu uživatele ke sdílení
revoke_share_access() {
local username="$1"
local share_name="$2"
if [ -z "$username" ]; then
echo -n "Zadejte uživatelské jméno: "
read username
fi
if [ -z "$share_name" ]; then
echo -n "Zadejte název sdílení: "
read share_name
fi
if [ -z "$username" ] || [ -z "$share_name" ]; then
echo "Chyba: Uživatelské jméno a název sdílení jsou povinné."
return 1
fi
check_config_exists
if ! grep -Fq "[$share_name]" "$CONFIG_FILE"; then
echo "Chyba: Sdílení [$share_name] nebylo nalezeno."
return 1
fi
echo "Vytvářím zálohu..."
cp "$CONFIG_FILE" "$BACKUP_FILE"
# Odeber uživatele z valid users
sed -i "/^\[$share_name\]/,/^\[/ s/\(valid users = .*\) $username/\1/" "$CONFIG_FILE"
sed -i "/^\[$share_name\]/,/^\[/ s/valid users = $username \(.*\)/valid users = \1/" "$CONFIG_FILE"
sed -i "/^\[$share_name\]/,/^\[/ s/valid users = $username$//" "$CONFIG_FILE"
echo "✅ Přístup uživatele '$username' ke sdílení '$share_name' byl odebrán."
}
# --- Hlavní logika skriptu (Router) --- # --- Hlavní logika skriptu (Router) ---
COMMAND="$1" COMMAND="$1"
ARGUMENT1="$2" ARGUMENT1="$2"
@ -561,9 +791,27 @@ case "$COMMAND" in
add_global_section add_global_section
test_and_restart test_and_restart
;; ;;
user-create|user-add)
create_samba_user "$MAIN_ARG"
test_and_restart
;;
user-delete|user-remove)
delete_samba_user "$MAIN_ARG"
;;
user-list)
list_samba_users
;;
user-access)
configure_user_shares "$MAIN_ARG"
test_and_restart
;;
user-revoke)
revoke_share_access "$MAIN_ARG" "$ARGUMENT2"
test_and_restart
;;
*) *)
echo "SMB Share Manager pro Arch Linux" echo "FSA - Universal Samba Share Manager"
echo "=================================" echo "===================================="
echo "Použití: sudo $0 {příkaz} [argument]" echo "Použití: sudo $0 {příkaz} [argument]"
echo "" echo ""
echo "Hlavní příkazy:" echo "Hlavní příkazy:"
@ -578,6 +826,13 @@ case "$COMMAND" in
echo " create-all - Vytvoří statická sdílení (home, root)." echo " create-all - Vytvoří statická sdílení (home, root)."
echo " delete <název> - Smaže existující sdílení." echo " delete <název> - Smaže existující sdílení."
echo " list - Vypíše nakonfigurovaná sdílení." echo " list - Vypíše nakonfigurovaná sdílení."
echo ""
echo "Správa uživatelů:"
echo " user-create [jméno] - Vytvoří nového Samba uživatele s heslem."
echo " user-delete [jméno] - Odstraní Samba uživatele."
echo " user-list - Vypíše všechny Samba uživatele."
echo " user-access [jméno] - Nastaví přístup uživatele ke sdílením."
echo " user-revoke <jméno> <share> - Odebere přístup uživatele ke sdílení."
exit 1 exit 1
;; ;;
esac esac