#!/bin/bash # rsync_backup_alldirection_cli.sh # Variables de base UTILISATEUR="debian" IP_DISTANTE="666.66.66.66" PORT_SSH="22" LOCAL_BASE_DIR="/home" # RĂ©pertoire de base local MOTDEPASSE="YOURPASS" # Votre mot de passe # Fonction d'affichage de la progression avec animation et human-readable (-h) afficher_progression() { echo -e "\e[1;32m🚀 En cours...\e[0m" sshpass -p "$MOTDEPASSE" rsync -avzh --progress -e "ssh -p $PORT_SSH" "$1" "$2" | pv -l -N "Transfert" } # =============================== # Fonctions pour l'envoi # =============================== interactive_send_file() { echo -e "\e[1;32m[SEND] Liste des fichiers locaux dans $LOCAL_BASE_DIR :\e[0m" IFS=$'\n' local_files=( $(find "$LOCAL_BASE_DIR" -maxdepth 1 -type f -printf '%p (%kK)\n') ) unset IFS if [ ${#local_files[@]} -eq 0 ]; then echo -e "\e[1;31m❌ Aucun fichier trouvĂ© dans $LOCAL_BASE_DIR\e[0m" exit 1 fi select lfile in "${local_files[@]}"; do if [ -n "$lfile" ]; then local_file=$(echo "$lfile" | awk '{print $1}') break else echo -e "\e[1;31m❌ Choix invalide, rĂ©essayez.\e[0m" fi done echo -e "\e[1;32m[SEND] Liste des rĂ©pertoires distants (dans /home) :\e[0m" remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d") select rdir in $remote_dirs; do if [ -n "$rdir" ]; then remote_dest="$rdir" break else echo -e "\e[1;31m❌ Choix invalide, rĂ©essayez.\e[0m" fi done echo -e "\e[1;32m[SEND] Envoi du fichier '$local_file' vers $UTILISATEUR@$IP_DISTANTE:$remote_dest...\e[0m" afficher_progression "$local_file" "$UTILISATEUR@$IP_DISTANTE:$remote_dest" } interactive_send_directory() { read -p "SpĂ©cifiez le chemin complet du rĂ©pertoire local Ă  envoyer : " local_dir if [ ! -d "$local_dir" ]; then echo -e "\e[1;31m❌ RĂ©pertoire non trouvĂ©.\e[0m" exit 1 fi echo -e "\e[1;32m[SEND] Liste des rĂ©pertoires distants (dans /home) :\e[0m" remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d") select rdir in $remote_dirs; do if [ -n "$rdir" ]; then remote_dest="$rdir" break else echo -e "\e[1;31m❌ Choix invalide, rĂ©essayez.\e[0m" fi done echo -e "\e[1;32m[SEND] Envoi du rĂ©pertoire '$local_dir' vers $UTILISATEUR@$IP_DISTANTE:$remote_dest...\e[0m" afficher_progression "$local_dir" "$UTILISATEUR@$IP_DISTANTE:$remote_dest" } # =============================== # Fonctions pour la rĂ©cupĂ©ration # =============================== interactive_receive_file() { echo -e "\e[1;34m[RECEIVE] Liste des rĂ©pertoires distants (dans /home) :\e[0m" remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d") select rdir in $remote_dirs; do if [ -n "$rdir" ]; then chosen_remote_dir="$rdir" break else echo -e "\e[1;31m❌ Choix invalide, rĂ©essayez.\e[0m" fi done echo -e "\e[1;34m[RECEIVE] Liste des fichiers dans '$chosen_remote_dir' (human readable) :\e[0m" IFS=$'\n' remote_files=( $(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find $chosen_remote_dir -maxdepth 1 -type f -printf '%p (%kK)\n'") ) unset IFS if [ ${#remote_files[@]} -eq 0 ]; then echo -e "\e[1;31m❌ Aucun fichier trouvĂ© dans $chosen_remote_dir\e[0m" exit 1 fi select rfile in "${remote_files[@]}"; do if [ -n "$rfile" ]; then remote_file=$(echo "$rfile" | awk '{print $1}') break else echo -e "\e[1;31m❌ Choix invalide, rĂ©essayez.\e[0m" fi done echo -e "\e[1;34m[RECEIVE] Liste des rĂ©pertoires locaux (dans $LOCAL_BASE_DIR) :\e[0m" local_dirs=$(find "$LOCAL_BASE_DIR" -maxdepth 1 -type d) select ldir in $local_dirs; do if [ -n "$ldir" ]; then local_dest="$ldir" break else echo -e "\e[1;31m❌ Choix invalide, rĂ©essayez.\e[0m" fi done echo -e "\e[1;34m[RECEIVE] RĂ©cupĂ©ration du fichier '$remote_file' vers $local_dest...\e[0m" afficher_progression "$UTILISATEUR@$IP_DISTANTE:$remote_file" "$local_dest" } interactive_receive_directory() { echo -e "\e[1;34m[RECEIVE] Liste des rĂ©pertoires distants (dans /home) :\e[0m" remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d") select rdir in $remote_dirs; do if [ -n "$rdir" ]; then remote_dir="$rdir" break else echo -e "\e[1;31m❌ Choix invalide, rĂ©essayez.\e[0m" fi done echo -e "\e[1;34m[RECEIVE] Liste des rĂ©pertoires locaux (dans $LOCAL_BASE_DIR) :\e[0m" local_dirs=$(find "$LOCAL_BASE_DIR" -maxdepth 1 -type d) select ldir in $local_dirs; do if [ -n "$ldir" ]; then local_dest="$ldir" break else echo -e "\e[1;31m❌ Choix invalide, rĂ©essayez.\e[0m" fi done echo -e "\e[1;34m[RECEIVE] RĂ©cupĂ©ration du rĂ©pertoire '$remote_dir' vers $local_dest...\e[0m" afficher_progression "$UTILISATEUR@$IP_DISTANTE:$remote_dir" "$local_dest" } # =============================== # Affichage des exemples de commandes CLI # =============================== show_commands_example() { echo -e "\e[1;35mExemples de commandes CLI :\e[0m" echo -e "1. Envoyer un rĂ©pertoire :" echo -e " sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" /chemin/vers/repertoire $UTILISATEUR@$IP_DISTANTE:/chemin/vers/destination" echo -e "2. Envoyer un fichier :" echo -e " sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" /chemin/vers/fichier $UTILISATEUR@$IP_DISTANTE:/chemin/vers/destination" echo -e "3. RĂ©cupĂ©rer un rĂ©pertoire :" echo -e " sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" $UTILISATEUR@$IP_DISTANTE:/chemin/vers/rĂ©pertoire /chemin/vers/destination" echo -e "4. RĂ©cupĂ©rer un fichier :" echo -e " sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" $UTILISATEUR@$IP_DISTANTE:/chemin/vers/fichier /chemin/vers/destination" exit 0 } # =============================== # Mode CLI avec getopts # =============================== while getopts "l:f:d:h" opt; do case $opt in l) LOCAL=$OPTARG ;; f) FILE=$OPTARG ;; d) DEST=$OPTARG ;; h) show_commands_example ;; *) show_commands_example ;; esac done if [ "$#" -gt 0 ]; then sshpass -p "$MOTDEPASSE" true > /dev/null if [ -n "$FILE" ] && [ -n "$DEST" ]; then LOCAL="$FILE" echo -e "\e[1;33mMode CLI (envoi de fichier) activĂ©.\e[0m" interactive_send_file exit 0 elif [ -n "$LOCAL" ] && [ -n "$DEST" ]; then echo -e "\e[1;33mMode CLI (envoi de rĂ©pertoire) activĂ©.\e[0m" interactive_send_directory exit 0 fi fi # =============================== # Mode interactif (aucun argument CLI) # =============================== sshpass -p "$MOTDEPASSE" true > /dev/null echo -e "\e[1;32m1. Envoyer un fichier ou rĂ©pertoire\e[0m" echo -e "\e[1;34m2. RĂ©cupĂ©rer un fichier ou rĂ©pertoire\e[0m" echo -e "\e[1;35m3. Afficher les exemples de commandes CLI\e[0m" read -p "Choisissez une option (1, 2 ou 3) : " choix case $choix in 1) echo -e "\e[1;32m🔧 Voulez-vous envoyer un fichier ou un rĂ©pertoire ?\e[0m" echo "1. Envoyer un fichier" echo "2. Envoyer un rĂ©pertoire" read -p "Choisissez une option (1 ou 2) : " choix_envoi if [ "$choix_envoi" -eq 1 ]; then interactive_send_file elif [ "$choix_envoi" -eq 2 ]; then interactive_send_directory else echo -e "\e[1;31m❌ Option invalide.\e[0m" fi ;; 2) echo -e "\e[1;34m🔧 Voulez-vous rĂ©cupĂ©rer un fichier ou un rĂ©pertoire ?\e[0m" echo "1. RĂ©cupĂ©rer un fichier" echo "2. RĂ©cupĂ©rer un rĂ©pertoire" read -p "Choisissez une option (1 ou 2) : " choix_recup if [ "$choix_recup" -eq 1 ]; then interactive_receive_file elif [ "$choix_recup" -eq 2 ]; then interactive_receive_directory else echo -e "\e[1;31m❌ Option invalide.\e[0m" fi ;; 3) show_commands_example ;; *) echo -e "\e[1;31m❌ Option invalide. Veuillez choisir 1, 2 ou 3.\e[0m" ;; esac