diff --git a/README.md b/README.md index 25c6098..562ef56 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,39 @@ sudo ./spravuj_sdileni.sh delete 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 +``` + +**Delete a Samba user**: +```bash +sudo ./spravuj_sdileni.sh user-delete [username] +``` +Optionally removes the system user as well. + ## Share Types The script creates different types of shares: diff --git a/spravuj_sdileni.sh b/spravuj_sdileni.sh index 0a66eae..b9c5eaa 100755 --- a/spravuj_sdileni.sh +++ b/spravuj_sdileni.sh @@ -502,6 +502,236 @@ interactive_mount_and_create() { 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) --- COMMAND="$1" ARGUMENT1="$2" @@ -561,9 +791,27 @@ case "$COMMAND" in add_global_section 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 "=================================" + echo "FSA - Universal Samba Share Manager" + echo "====================================" echo "Použití: sudo $0 {příkaz} [argument]" echo "" echo "Hlavní příkazy:" @@ -578,6 +826,13 @@ case "$COMMAND" in echo " create-all - Vytvoří statická sdílení (home, root)." echo " delete - Smaže existující 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 - Odebere přístup uživatele ke sdílení." exit 1 ;; esac