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:
parent
9c97169799
commit
74c2dd0daf
2 changed files with 290 additions and 2 deletions
33
README.md
33
README.md
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue