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
|
|
@ -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 <název> - 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 <jméno> <share> - Odebere přístup uživatele ke sdílení."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue