rsync_backup_all_direction_cli.sh
· 8.6 KiB · Bash
Raw
#!/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
| 1 | #!/bin/bash |
| 2 | # rsync_backup_alldirection_cli.sh |
| 3 | |
| 4 | # Variables de base |
| 5 | UTILISATEUR="debian" |
| 6 | IP_DISTANTE="666.66.66.66" |
| 7 | PORT_SSH="22" |
| 8 | LOCAL_BASE_DIR="/home" # Répertoire de base local |
| 9 | MOTDEPASSE="YOURPASS" # Votre mot de passe |
| 10 | |
| 11 | # Fonction d'affichage de la progression avec animation et human-readable (-h) |
| 12 | afficher_progression() { |
| 13 | echo -e "\e[1;32m🚀 En cours...\e[0m" |
| 14 | sshpass -p "$MOTDEPASSE" rsync -avzh --progress -e "ssh -p $PORT_SSH" "$1" "$2" | pv -l -N "Transfert" |
| 15 | } |
| 16 | |
| 17 | # =============================== |
| 18 | # Fonctions pour l'envoi |
| 19 | # =============================== |
| 20 | |
| 21 | interactive_send_file() { |
| 22 | echo -e "\e[1;32m[SEND] Liste des fichiers locaux dans $LOCAL_BASE_DIR :\e[0m" |
| 23 | IFS=$'\n' |
| 24 | local_files=( $(find "$LOCAL_BASE_DIR" -maxdepth 1 -type f -printf '%p (%kK)\n') ) |
| 25 | unset IFS |
| 26 | if [ ${#local_files[@]} -eq 0 ]; then |
| 27 | echo -e "\e[1;31m❌ Aucun fichier trouvé dans $LOCAL_BASE_DIR\e[0m" |
| 28 | exit 1 |
| 29 | fi |
| 30 | select lfile in "${local_files[@]}"; do |
| 31 | if [ -n "$lfile" ]; then |
| 32 | local_file=$(echo "$lfile" | awk '{print $1}') |
| 33 | break |
| 34 | else |
| 35 | echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m" |
| 36 | fi |
| 37 | done |
| 38 | |
| 39 | echo -e "\e[1;32m[SEND] Liste des répertoires distants (dans /home) :\e[0m" |
| 40 | remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d") |
| 41 | select rdir in $remote_dirs; do |
| 42 | if [ -n "$rdir" ]; then |
| 43 | remote_dest="$rdir" |
| 44 | break |
| 45 | else |
| 46 | echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m" |
| 47 | fi |
| 48 | done |
| 49 | |
| 50 | echo -e "\e[1;32m[SEND] Envoi du fichier '$local_file' vers $UTILISATEUR@$IP_DISTANTE:$remote_dest...\e[0m" |
| 51 | afficher_progression "$local_file" "$UTILISATEUR@$IP_DISTANTE:$remote_dest" |
| 52 | } |
| 53 | |
| 54 | interactive_send_directory() { |
| 55 | read -p "Spécifiez le chemin complet du répertoire local à envoyer : " local_dir |
| 56 | if [ ! -d "$local_dir" ]; then |
| 57 | echo -e "\e[1;31m❌ Répertoire non trouvé.\e[0m" |
| 58 | exit 1 |
| 59 | fi |
| 60 | echo -e "\e[1;32m[SEND] Liste des répertoires distants (dans /home) :\e[0m" |
| 61 | remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d") |
| 62 | select rdir in $remote_dirs; do |
| 63 | if [ -n "$rdir" ]; then |
| 64 | remote_dest="$rdir" |
| 65 | break |
| 66 | else |
| 67 | echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m" |
| 68 | fi |
| 69 | done |
| 70 | echo -e "\e[1;32m[SEND] Envoi du répertoire '$local_dir' vers $UTILISATEUR@$IP_DISTANTE:$remote_dest...\e[0m" |
| 71 | afficher_progression "$local_dir" "$UTILISATEUR@$IP_DISTANTE:$remote_dest" |
| 72 | } |
| 73 | |
| 74 | # =============================== |
| 75 | # Fonctions pour la récupération |
| 76 | # =============================== |
| 77 | |
| 78 | interactive_receive_file() { |
| 79 | echo -e "\e[1;34m[RECEIVE] Liste des répertoires distants (dans /home) :\e[0m" |
| 80 | remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d") |
| 81 | select rdir in $remote_dirs; do |
| 82 | if [ -n "$rdir" ]; then |
| 83 | chosen_remote_dir="$rdir" |
| 84 | break |
| 85 | else |
| 86 | echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m" |
| 87 | fi |
| 88 | done |
| 89 | |
| 90 | echo -e "\e[1;34m[RECEIVE] Liste des fichiers dans '$chosen_remote_dir' (human readable) :\e[0m" |
| 91 | IFS=$'\n' |
| 92 | remote_files=( $(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find $chosen_remote_dir -maxdepth 1 -type f -printf '%p (%kK)\n'") ) |
| 93 | unset IFS |
| 94 | if [ ${#remote_files[@]} -eq 0 ]; then |
| 95 | echo -e "\e[1;31m❌ Aucun fichier trouvé dans $chosen_remote_dir\e[0m" |
| 96 | exit 1 |
| 97 | fi |
| 98 | select rfile in "${remote_files[@]}"; do |
| 99 | if [ -n "$rfile" ]; then |
| 100 | remote_file=$(echo "$rfile" | awk '{print $1}') |
| 101 | break |
| 102 | else |
| 103 | echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m" |
| 104 | fi |
| 105 | done |
| 106 | |
| 107 | echo -e "\e[1;34m[RECEIVE] Liste des répertoires locaux (dans $LOCAL_BASE_DIR) :\e[0m" |
| 108 | local_dirs=$(find "$LOCAL_BASE_DIR" -maxdepth 1 -type d) |
| 109 | select ldir in $local_dirs; do |
| 110 | if [ -n "$ldir" ]; then |
| 111 | local_dest="$ldir" |
| 112 | break |
| 113 | else |
| 114 | echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m" |
| 115 | fi |
| 116 | done |
| 117 | |
| 118 | echo -e "\e[1;34m[RECEIVE] Récupération du fichier '$remote_file' vers $local_dest...\e[0m" |
| 119 | afficher_progression "$UTILISATEUR@$IP_DISTANTE:$remote_file" "$local_dest" |
| 120 | } |
| 121 | |
| 122 | interactive_receive_directory() { |
| 123 | echo -e "\e[1;34m[RECEIVE] Liste des répertoires distants (dans /home) :\e[0m" |
| 124 | remote_dirs=$(sshpass -p "$MOTDEPASSE" ssh -p $PORT_SSH $UTILISATEUR@$IP_DISTANTE "find /home -maxdepth 1 -type d") |
| 125 | select rdir in $remote_dirs; do |
| 126 | if [ -n "$rdir" ]; then |
| 127 | remote_dir="$rdir" |
| 128 | break |
| 129 | else |
| 130 | echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m" |
| 131 | fi |
| 132 | done |
| 133 | |
| 134 | echo -e "\e[1;34m[RECEIVE] Liste des répertoires locaux (dans $LOCAL_BASE_DIR) :\e[0m" |
| 135 | local_dirs=$(find "$LOCAL_BASE_DIR" -maxdepth 1 -type d) |
| 136 | select ldir in $local_dirs; do |
| 137 | if [ -n "$ldir" ]; then |
| 138 | local_dest="$ldir" |
| 139 | break |
| 140 | else |
| 141 | echo -e "\e[1;31m❌ Choix invalide, réessayez.\e[0m" |
| 142 | fi |
| 143 | done |
| 144 | |
| 145 | echo -e "\e[1;34m[RECEIVE] Récupération du répertoire '$remote_dir' vers $local_dest...\e[0m" |
| 146 | afficher_progression "$UTILISATEUR@$IP_DISTANTE:$remote_dir" "$local_dest" |
| 147 | } |
| 148 | |
| 149 | # =============================== |
| 150 | # Affichage des exemples de commandes CLI |
| 151 | # =============================== |
| 152 | show_commands_example() { |
| 153 | echo -e "\e[1;35mExemples de commandes CLI :\e[0m" |
| 154 | echo -e "1. Envoyer un répertoire :" |
| 155 | echo -e " sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" /chemin/vers/repertoire $UTILISATEUR@$IP_DISTANTE:/chemin/vers/destination" |
| 156 | echo -e "2. Envoyer un fichier :" |
| 157 | echo -e " sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" /chemin/vers/fichier $UTILISATEUR@$IP_DISTANTE:/chemin/vers/destination" |
| 158 | echo -e "3. Récupérer un répertoire :" |
| 159 | echo -e " sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" $UTILISATEUR@$IP_DISTANTE:/chemin/vers/répertoire /chemin/vers/destination" |
| 160 | echo -e "4. Récupérer un fichier :" |
| 161 | echo -e " sshpass -p '$MOTDEPASSE' rsync -avzh --progress -e \"ssh -p $PORT_SSH\" $UTILISATEUR@$IP_DISTANTE:/chemin/vers/fichier /chemin/vers/destination" |
| 162 | exit 0 |
| 163 | } |
| 164 | |
| 165 | # =============================== |
| 166 | # Mode CLI avec getopts |
| 167 | # =============================== |
| 168 | while getopts "l:f:d:h" opt; do |
| 169 | case $opt in |
| 170 | l) LOCAL=$OPTARG ;; |
| 171 | f) FILE=$OPTARG ;; |
| 172 | d) DEST=$OPTARG ;; |
| 173 | h) show_commands_example ;; |
| 174 | *) show_commands_example ;; |
| 175 | esac |
| 176 | done |
| 177 | |
| 178 | if [ "$#" -gt 0 ]; then |
| 179 | sshpass -p "$MOTDEPASSE" true > /dev/null |
| 180 | if [ -n "$FILE" ] && [ -n "$DEST" ]; then |
| 181 | LOCAL="$FILE" |
| 182 | echo -e "\e[1;33mMode CLI (envoi de fichier) activé.\e[0m" |
| 183 | interactive_send_file |
| 184 | exit 0 |
| 185 | elif [ -n "$LOCAL" ] && [ -n "$DEST" ]; then |
| 186 | echo -e "\e[1;33mMode CLI (envoi de répertoire) activé.\e[0m" |
| 187 | interactive_send_directory |
| 188 | exit 0 |
| 189 | fi |
| 190 | fi |
| 191 | |
| 192 | # =============================== |
| 193 | # Mode interactif (aucun argument CLI) |
| 194 | # =============================== |
| 195 | sshpass -p "$MOTDEPASSE" true > /dev/null |
| 196 | |
| 197 | echo -e "\e[1;32m1. Envoyer un fichier ou répertoire\e[0m" |
| 198 | echo -e "\e[1;34m2. Récupérer un fichier ou répertoire\e[0m" |
| 199 | echo -e "\e[1;35m3. Afficher les exemples de commandes CLI\e[0m" |
| 200 | read -p "Choisissez une option (1, 2 ou 3) : " choix |
| 201 | |
| 202 | case $choix in |
| 203 | 1) |
| 204 | echo -e "\e[1;32m🔧 Voulez-vous envoyer un fichier ou un répertoire ?\e[0m" |
| 205 | echo "1. Envoyer un fichier" |
| 206 | echo "2. Envoyer un répertoire" |
| 207 | read -p "Choisissez une option (1 ou 2) : " choix_envoi |
| 208 | if [ "$choix_envoi" -eq 1 ]; then |
| 209 | interactive_send_file |
| 210 | elif [ "$choix_envoi" -eq 2 ]; then |
| 211 | interactive_send_directory |
| 212 | else |
| 213 | echo -e "\e[1;31m❌ Option invalide.\e[0m" |
| 214 | fi |
| 215 | ;; |
| 216 | 2) |
| 217 | echo -e "\e[1;34m🔧 Voulez-vous récupérer un fichier ou un répertoire ?\e[0m" |
| 218 | echo "1. Récupérer un fichier" |
| 219 | echo "2. Récupérer un répertoire" |
| 220 | read -p "Choisissez une option (1 ou 2) : " choix_recup |
| 221 | if [ "$choix_recup" -eq 1 ]; then |
| 222 | interactive_receive_file |
| 223 | elif [ "$choix_recup" -eq 2 ]; then |
| 224 | interactive_receive_directory |
| 225 | else |
| 226 | echo -e "\e[1;31m❌ Option invalide.\e[0m" |
| 227 | fi |
| 228 | ;; |
| 229 | 3) |
| 230 | show_commands_example |
| 231 | ;; |
| 232 | *) |
| 233 | echo -e "\e[1;31m❌ Option invalide. Veuillez choisir 1, 2 ou 3.\e[0m" |
| 234 | ;; |
| 235 | esac |
| 236 |