Skip to content

Instantly share code, notes, and snippets.

@fusco
Created March 4, 2014 16:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fusco/9350432 to your computer and use it in GitHub Desktop.
Save fusco/9350432 to your computer and use it in GitHub Desktop.
gestion vsftp
#!/bin/sh
# =============================================================================
#
# File .....: vsftp_am.sh - Manage virtual user accounts for vsftp
# Date .....: 23/06/2007
#
# -------------------------------
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to :
#
# the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301 USA
#
# -------------------------------
#
# Description :
# Ce programme se place dans le contexte de l'utilisation de vsftp avec
# une gestion des utilisateurs virtuels. Une base Berkeley contient le login
# et le mot de passe de chacun des utilisateurs ayant un compte FTP sur le
# machine. La configuration utilisee est entierement décrite a l'adresse
# suivante :
#
# http://smhteam.info/wiki/index.linux.php5?wiki=Vsftpd
#
# Prerequis :
# Le package db4.5-util doit etre installe sur votre systeme.
#
# Remarques :
# 1/ Le fichier de configuration pour l'utilisateur virtuel est cree mais
# vierge. C'est a l'administrateur de renseigner ces fichiers suivant les
# droits des utilisateurs.
#
# =============================================================================
# Declaration des constantes
# ----------------------------------------------
RELEASE='0.4.0'
VSFTPD_DIRECTORY='/etc/vsftpd/'
USER_CONF_DIRECTORY=$VSFTPD_DIRECTORY'vsftpd_user_conf/'
DB_FILENAME=$VSFTPD_DIRECTORY'login.db'
# Initialisation des variables
# ----------------------------------------------
old_db='' # Ancienne base de donnees
new_db='' # Nouvelle base de donnees
old_user='' # Ancien utilisateur
new_user='' # Nouvel utilisateur
new_password='' # Nouveau password
# =============================================================================
# Recuperer les donnees de l'ancienne base
# =============================================
#
# Cette fonction permet de recuperer les donnees presentes dans la base de
# donnees actuelle. Les informations obtenues par le dump de la base sont sous
# forme de liste login, password, login ...
#
# Syntax : GetOldDb db_filename
#
# Return : old_db : les données de l'ancienne base de donnees
GetOldDb ()
{
local db_filename=$1 # Nom de la base de donnees
echo "Récuperation de la base de donnees $db_filename."
# Extraire les informations de la base de donnees
if [ -e "$db_filename" ]; then
old_db=`db4.5_dump -d a $db_filename | grep " data" | sed 's/data: /|/g' | cut -d'|' -f2`;
fi
}
# =============================================================================
# Verifier l'existence d'un utilisateur
# =============================================
#
# Cette fonction permet de vérifier l'existence ou non d'un utilisateur $user
# dans la base de données $db.
#
# Syntax : CheckExistingUser user db
#
# Return : 0 : si l'utilisateur $user existe dans la base $db
# 1 : si l'utilisateur $user n'existe pas dans la base $db
CheckExistingUser ()
{
local password=0 # 0:champs password - 1:champs login
local user=$1 # Login de l'utilisateur
local db=$2 # Dump associe a la base de donnees
echo "Vérification des utilisateurs existant dans la base."
# Vérifier l'existence de l'utilisateur
for field in $db; do
if [ "$password" = 0 ] && [ "$user" = "$field" ]; then return 0; fi
: $((password^=1))
done
return 1
}
# =============================================================================
# Mettre a jour un mot de passe
# =============================================
#
# Cette fonction permet de mettre a jour le mot de passe de l'utilsateur $user
# dans la base $db
#
# Syntax : UpdatePassword user password db
#
# Return : 0 : si l'operation a ete faite avec succes
# 1 : si une erreur est survenue (utilisateur existant)
UpdatePassword ()
{
local user=$1 # Login de l'utilisateur associe au mot de passe
local password=$2 # Nouveau mot de passe
local db=$3 # Dump associee a la base de donnees
local replace='no'
# Tester l'existence de l'utilisateur
CheckExistingUser "$user" "$db"
# Mettre fin a la mise a jour si l'utilisateur n'existe pas
if [ "$?" -eq 1 ]; then
{
printf "\033[40m\033[1;31m[ Erreur ]: Utilisateur $user inexistant.\033[0m\n";
return 1;
}
# Autrement continuer ...
else
{
echo "Mise a jour du password pour l'utilisateur $user dans la base."
# Parcourir la base de donnees pour changer le mot de passe
for field in $db; do
{
if [ "$replace" = "yes" ]; then { field=$password; replace='no'; } fi
if [ "$field" = "$user" ]; then replace='yes'; fi
new_db=$new_db" "$field
}
done
}
fi
return 0
}
# =============================================================================
# Ajouter un utilisateur
# =============================================
#
# Cette fonction permet d'ajouter un utilisateur a la base de donnees. Elle se
# charge de creer le repertoire personnel du nouvel utilisateur ainsi qu'un
# fichier de configuration "vierge". Le fichier de configuration est a
# renseigner par l'administrateur suivant les droits qu'il veut accorder.
#
# Syntax : AddUser user password db
#
# Return : 0 : si l'operation a ete faite avec succes
# 1 : si une erreur est survenue (utilisateur existant)
AddUser()
{
local user=$1 # Login du nouvel utilisateur
local password=$2 # Mot de passe du nouvel utilisateur
local db=$3 # Dump associe a la base de donnees
# Tester l'existence de l'utilisateur
CheckExistingUser "$user" "$db"
# Mettre fin a l'ajout de l'utilisateur si ce dernier existe deja
if [ "$?" -eq 0 ]; then
{
printf "\033[40m\033[1;31m[ Erreur ]: Utilisateur $user existant.\033[0m\n";
return 1;
}
# Autrement formater les donnees du nouvel utilisateur
else
{
echo "Ajout du nouvel utilisateur $user à la base."
password=`openssl passwd -crypt $password`
new_db="$db"" "$user" "$password
}
fi
# Creer le repertoire personnel et ses sous repertoires
if [ ! -d ~virtual/$user ]; then
{
echo "Ajout du répertoire personnel ~virtual/$user pour l'utilisateur virtuel '$user.'"
mkdir ~virtual/$user ~virtual/$user/upload ~virtual/$user/partage1
chmod 2750 ~virtual/$user/
chmod 770 ~virtual/$user/upload/
chmod 600 ~virtual/$user/partage1/
# Creer le fichier de configuration de l'utilisateur virtuel
# (fichier vierge)
if [ ! -e $USER_CONF_DIRECTORY$user ]; then
{
echo "Ajout du fichier de configuration $USER_CONF_DIRECTORY$user pour l'utilisateur virtuel '$user.'"
touch $USER_CONF_DIRECTORY$user
}
else
printf "\033[40m\033[1;33m[ Warning ]: $USER_CONF_DIRECTORY$user omission, ce fichier existe déja.\033[0m\n"
fi
}
else
printf "\033[40m\033[1;33m[ Warning ]: ~virtual/$user omission, ce répertoire existe déja.\033[0m\n"
fi
return 0
}
# =============================================================================
# Supprimer un utilisateur
# =============================================
#
# Cette fonction supprime un utilisateur virtuel. Le compte de ce dernier,
# ainsi que sont fichier de configuration sont supprimes, et l'utilisateur est
# retire de la base de donnees accorder.
#
# Syntax : Remove user db
#
# Return : 0 : si l'operation a ete faite avec succes
# 1 : si une erreur est survenue (utilisateur inexistant)
RemoveUser()
{
local user=$1 # Login de l'utilisateur a supprimer
local db=$2 # Dump associe a la base de donnees
local remove='no'
# Tester l'existence de l'utilisateur
CheckExistingUser "$user" "$db"
# Arreter la mise a jour de la base si l'utilisateur est inexistant
if [ "$?" -eq 1 ]; then
{
printf "\033[40m\033[1;31m[ Erreur ]: Utilisateur $user inexistant.\033[0m\n";
return 1;
}
# Autrement continuer ...
else
{
echo "Retrait de l'utilisateur $user de la base."
# Parcourir la liste des donnees et supprimer l'utilisateur
for field in $db; do
{
if [ "$remove" = "yes" ]; then { remove='no'; field=''; } fi
if [ "$field" = "$user" ]; then { remove='yes'; field=''; } fi
new_db=$new_db" "$field
}
done
}
fi
# Suppimer le repertoire personnel
echo "Suppresion du répertoire personnel ~virtual/$user pour l'utilisateur virtuel '$user'."
rm -R ~virtual/$user
# Supprimer le fichier de configuration
echo "Suppression du fichier de configuration $USER_CONF_DIRECTORY$user pour l'utilisateur virtuel '$user.'"
rm $USER_CONF_DIRECTORY$user
return 0
}
# =============================================================================
# Creer une base de donnees
# =============================================
#
# Cette fcontion permet de creer une nouvelle base de donnees Berkeley.
#
# Syntax : CreateNewDb db filename
#
# Return : 0 : si l'operation a ete faite avec succes
# 1 : si une erreur est survenue
CreateNewDb ()
{
local db=$1 # Dump de la base de donnees a charger
local filename=$2 # Nom de la base de donnees
echo "Création de la nouvelle base de données ..."
# Sauvegarder l'ancienne base de donnees
if [ -e "$filename" ]; then mv "$filename" "$filename"".old"; fi
# Supprimer l'ancien fichier temporaire si il existe
if [ -e "$filename"".txt" ]; then rm -f "$filename"".txt"; fi
# Creer le fichier temporaire et modifier ses droits
touch $filename".txt"
chmod 600 $filename".txt"
# Charger les donnees dans le fichier
for field in $db; do
echo "$field" >> "$filename"".txt"
done
echo '' >> "$filename"".txt"
# Creer la nouvelle base de donnees
db4.5_load -T -t hash -f $filename".txt" $filename
# Supprimer le fichier temporaire
rm -f $filename".txt"
# Modifier les droits sur la base de donnees
chmod 600 $filename
return 0
}
# Programme principal
# ----------------------------------------------
# Verifier que l'utilisateur est bien root
if (( `/usr/bin/id -u` != 0 )); then { echo "Désolé, Vous devez être root..."; exit 1; } fi
printf "\033[40m\033[1;32mScript de gestion de la base Berkeley associée à vsftpd - v$RELEASE\033[0m\n"
echo "------------------------------------------------------------------"
echo -n "Commande : "
# Prendre en compte l'argument de la commande et rediriger le script
case "$1" in
'-a')
echo "Add user"
echo -n "Login du nouvel utilisateur : "
read new_user
new_password=`openssl passwd -crypt`
GetOldDb "$DB_FILENAME"
AddUser "$new_user" "$new_password" "$old_db"
if [ "$?" -eq 1 ]; then exit 1;
else CreateNewDb "$new_db" "$DB_FILENAME";
fi
;;
'-d')
echo "Display database"
GetOldDb "$DB_FILENAME"
if [ -z "$old_db" ]; then echo "Base de données vide";
else
j=0
for i in $old_db; do
if [ "$j" -eq 1 ]; then echo $row "(P)"$i
else row="(L)"$i" -"
fi
: $((j^=1))
done
fi
;;
'-r')
echo "Delete user"
echo -n "Login de l'ancien utilisateur : "
read old_user
GetOldDb "$DB_FILENAME"
RemoveUser "$old_user" "$old_db"
if [ "$?" -eq 1 ]; then exit 1;
else CreateNewDb "$new_db" "$DB_FILENAME";
fi
;;
'-u')
echo "Update user"
echo -n "Mettre à jour le password de l'utilisateur : "
read old_user
new_password=`openssl passwd -crypt`
GetOldDb "$DB_FILENAME"
UpdatePassword "$old_user" "$new_password" "$old_db"
if [ "$?" -eq 1 ]; then exit 1;
else CreateNewDb "$new_db" "$DB_FILENAME";
fi
;;
*)
echo "Help"
;;
esac
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment