[center]Bonjour,[/center]
j'avais programmé il y a des années (!) 2 scripts pour :
1. synchroniser une source distante avec une cible locale
2. synchroniser une source locale avec une cible distance
tous deux basés sur le très puissant
rsync
les algos de chiffrement sont à adapter, les voici pour info
je précise en passant que je ne suis pas un pro de la programmation shell, mais ces deux scripts pourront probablement vous rendre service
synchronistation d'une source distante avec une cible locale
#!/usr/bin/env bash
# -------------------
# objet : synchronisation réseau d'une source distante avec une cible locale
# -------------------
# ---------
# procédure générique de synchronisation d'une source distante avec une cible locale
# ---------
# $1 : rsync_user
# $2 : options_rsync
# $3 : ssh_user
# $4 : options_ssh
# $5 : ssh_cypher
# $6 : remote_host
# $7 : ssh_remote_port
# $8 : chemin_source_distant
# $9 : chemin_cible_local
# ---------
# $10 : timeout
# ---------
synchronisation_source_distante_avec_cible_locale_generique()
{
if [[ ${UID} -eq 0 ]] ; then
if [[ ${#} -ge 9 && ${#} -le 10 ]] ; then
# -------------------
# paramètres obligatoires
# ----------------------
declare -r local rsync_user="${1}"
declare -r local options_rsync="${2}"
declare -r local ssh_user="${3}"
declare -r local options_ssh="${4}"
declare -r local ssh_cipher="${5}"
declare -r local remote_host="${6}"
declare -ir local ssh_remote_port="${7}"
declare -r local chemin_source_distant="${8}"
declare -r local chemin_cible_local="${9}"
# -------------------
# paramètres par défaut
# -------------------
declare -i local timeout=15
# -------------------
# paramètres optionnels
# -------------------
if [[ ${#} -ge 10 ]] ; then
timeout="${10}"
fi
# ----------------------
# routine principale
# ----------------------
nice -n 19 rsync ${options_rsync} --timeout=${timeout} --rsh="ssh ${options_ssh} ${ssh_cipher} -l ${ssh_user} -p ${ssh_remote_port}" "${rsync_user}@${remote_host}:${chemin_source_distant}" "${chemin_cible_local}" --exclude="- lost+found/" || { echo "synchronisation réseau impossible" >&2 ; return 1 ; }
else
echo "nombre de paramètres (${#}) incorrect" >&2
return 1
fi
else
echo -e '\n\t< il faut être root pour faire une synchronisation réseau de données via ssh >' >&2
return 1
fi
}
# ---------
# procédure simplifiée de synchronisation d'une source distante avec une cible locale
# ---------
# $1 : chemin_source_distant
# $2 : chemin_cible_local
# $3 : remote_host
# ---------
# $4 : remote_port
# $5 : timeout
# ---------
synchronisation_source_distante_avec_cible_locale()
{
if [[ ${#} -ge 3 && ${#} -le 5 ]] ; then
# -------------------
# paramètres standard
# -------------------
declare -r local rsync_user='root'
declare -r local options_rsync='-Raz --acls --xattrs --numeric-ids --delete --stats --partial --progress --partial-dir=~/.rsync-partial'
declare -r local ssh_user='root'
declare -r local options_ssh='-CTx'
declare -r local ssh_cipher='-c chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr -m hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512'
# ----------------------
# paramètres obligatoires
# ----------------------
declare -r local chemin_source_distant="${1}"
declare -r local chemin_cible_local="${2}"
declare -r local remote_host="${3}"
# ---------------------
# paramètres par défaut
# ---------------------
declare -i local ssh_remote_port=22
declare -i local timeout=15
# ---------------------
# paramètres optionnels
# ---------------------
if [[ ${#} -ge 4 ]] ; then
ssh_remote_port="${4}"
fi
if [[ ${#} -ge 5 ]] ; then
timeout="${5}"
fi
# ------------------
# routine principale
# ------------------
synchronisation_source_distante_avec_cible_locale_generique "${rsync_user}" "${options_rsync}" "${ssh_user}" "${options_ssh}" "${ssh_cipher}" "${remote_host}" "${ssh_remote_port}" "${chemin_source_distant}" "${chemin_cible_local}" "${timeout}"
else
echo "nombre de paramètres (${#}) incorrect" >&2
return 1
fi
}
# ---------
# routine principale
# ---------
synchronisation_source_distante_avec_cible_locale "${@}"
synchronistation d'une source locale avec une cible distante
#!/usr/bin/env bash
# -------------------
# objet : synchronisation réseau d'une source locale avec une cible distante
# -------------------
# ---------
# procédure générique de synchronisation d'une source locale avec une cible distante
# ---------
# $1 : rsync_user
# $2 : options_rsync
# $3 : ssh_user
# $4 : options_ssh
# $5 : ssh_cypher
# $6 : remote_host
# $7 : ssh_remote_port
# $8 : chemin_source_local
# $9 : chemin_cible_distant
# ---------
# $10 : timeout
# ---------
synchronisation_source_locale_avec_cible_distante_generique()
{
if [[ ${UID} -eq 0 ]] ; then
if [[ ${#} -ge 9 && ${#} -le 10 ]] ; then
# -------------------
# paramètres obligatoires
# ----------------------
declare -r local rsync_user="${1}"
declare -r local options_rsync="${2}"
declare -r local ssh_user="${3}"
declare -r local options_ssh="${4}"
declare -r local ssh_cipher="${5}"
declare -r local remote_host="${6}"
declare -ir local ssh_remote_port="${7}"
declare -r local chemin_source_local="${8}"
declare -r local chemin_cible_distant="${9}"
# -------------------
# paramètres par défaut
# -------------------
declare -i local timeout=15
# -------------------
# paramètres optionnels
# -------------------
if [[ ${#} -ge 10 ]] ; then
timeout="${10}"
fi
# ----------------------
# routine principale
# ----------------------
nice -n 19 rsync ${options_rsync} --timeout=${timeout} --rsh="ssh ${options_ssh} ${ssh_cipher} -l ${ssh_user} -p ${ssh_remote_port}" "${chemin_source_local}" "${rsync_user}@${remote_host}:${chemin_cible_distant}" --exclude="- lost+found/" || { echo "synchronisation réseau impossible" >&2 ; return 1 ; }
else
echo "nombre de paramètres (${#}) incorrect" >&2
return 1
fi
else
echo -e '\n\t< il faut être root pour faire une synchronisation réseau de données via ssh >' >&2
return 1
fi
}
# ---------
# procédure simplifiée de synchronisation d'une source locale avec une cible distante
# ---------
# $1 : chemin_source_local
# $2 : chemin_cible_distant
# $3 : remote_host
# ---------
# $4 : remote_port
# $5 : timeout
# ---------
synchronisation_source_locale_avec_cible_distante()
{
if [[ ${#} -ge 3 && ${#} -le 5 ]] ; then
# -------------------
# paramètres standard
# -------------------
declare -r local rsync_user='root'
declare -r local options_rsync='-Raz --acls --xattrs --numeric-ids --delete --partial --partial-dir=~/.rsync-partial'
declare -r local ssh_user='root'
declare -r local options_ssh='-x -T -o Compression=no'
declare -r local ssh_cipher='-c chacha20-poly1305@openssh.com'
# ----------------------
# paramètres obligatoires
# ----------------------
declare -r local chemin_source_local="${1}"
declare -r local chemin_cible_distant="${2}"
declare -r local remote_host="${3}"
# ---------------------
# paramètres par défaut
# ---------------------
declare -i local ssh_remote_port=22
declare -i local timeout=15
# ---------------------
# paramètres optionnels
# ---------------------
if [[ ${#} -ge 4 ]] ; then
ssh_remote_port="${4}"
fi
if [[ ${#} -ge 5 ]] ; then
timeout="${5}"
fi
# ------------------
# routine principale
# ------------------
synchronisation_source_locale_avec_cible_distante_generique "${rsync_user}" "${options_rsync}" "${ssh_user}" "${options_ssh}" "${ssh_cipher}" "${remote_host}" "${ssh_remote_port}" "${chemin_source_local}" "${chemin_cible_distant}" "${timeout}"
else
echo "nombre de paramètres (${#}) incorrect" >&2
return 1
fi
}
# ---------
# routine principale
# ---------
synchronisation_source_locale_avec_cible_distante "${@}"
pour chacune des deux machines, il faut créer une clef ssh pour l'utilisateur root sans mot de passe
les quelques lignes de description en en-tête de chaque script devrait vous suffire
bien sûr, à adapter à votre besoin (et à corriger le cas échéant)