← retour aux snippets

scp: transfert entre serveurs via bastion (-3)

Copier des fichiers directement d'un serveur à un autre en passant par un bastion local, avec options sûres.


objectif

Transférer un fichier de prod vers staging (ou inversement) sans le télécharger localement, en utilisant scp -3 et un saut via bastion.data.pm. Préserver dates/permissions, compresser, limiter la bande passante.

code minimal

# copie indirecte prod -> staging via votre machine (flux traverse localement)
scp -3 -p -C -o ProxyJump=bastion.data.pm \
  deploy@data.pm:/srv/data.pm/current/CHECKSUM.SHA256 \
  deploy@staging.data.pm:/srv/data.pm/current/CHECKSUM.SHA256

utilisation

# 1) dossier complet (récursif), permissions et timestamps préservés
scp -3 -r -p -C -o ProxyJump=bastion.data.pm \
  deploy@data.pm:/srv/data.pm/releases/2025-08-15_1200 \
  deploy@staging.data.pm:/srv/data.pm/releases/

# 2) limiter la bande passante à 8 Mbit/s (éviter de saturer le lien)
scp -3 -p -C -l 8192 -o ProxyJump=bastion.data.pm \
  deploy@api.data.pm:/srv/api.data.pm/export.ndjson.zst \
  deploy@staging.data.pm:/srv/api.data.pm/import/export.ndjson.zst

# 3) port SSH personnalisé côté source et/ou destination
scp -3 -P 4422 -p -C -o ProxyJump=bastion.data.pm \
  deploy@git.data.pm:/data/backup/repos.tar.zst \
  -P 22 deploy@staging.data.pm:/srv/backups/repos.tar.zst

# 4) transfert d'un seul fichier sensible (vérifier ensuite la somme)
scp -3 -p -C -o ProxyJump=bastion.data.pm \
  deploy@data.pm:/srv/data.pm/current/config/app.json \
  deploy@staging.data.pm:/srv/data.pm/current/config/app.json
ssh deploy@staging.data.pm 'sha256sum /srv/data.pm/current/config/app.json' \
  || ssh deploy@staging.data.pm 'shasum -a 256 /srv/data.pm/current/config/app.json'

# 5) logs ciblés (taille limitée) de prod vers votre machine, puis vers staging (deux étapes)
ssh deploy@data.pm 'tail -c 5M /var/log/data.pm/access.log' > /tmp/access.last5M.log
scp -p -C /tmp/access.last5M.log deploy@staging.data.pm:/tmp/

variante(s) utile(s)

# ProxyJump explicite par hôte (simplifie les commandes)
cat >> ~/.ssh/config <<'SSHCONF'
Host bastion
  HostName bastion.data.pm
  User ops
  ControlMaster auto
  ControlPersist 15m
  ControlPath ~/.ssh/cm/%C

Host www-prod
  HostName data.pm
  User deploy
  ProxyJump bastion

Host www-staging
  HostName staging.data.pm
  User deploy
  ProxyJump bastion
SSHCONF

# puis:
scp -3 -r -p -C www-prod:/srv/data.pm/releases/2025-08-15_1200 www-staging:/srv/data.pm/releases/

# alternative rsync (plus robuste, reprise et checksums)
rsync -a -e 'ssh -o ProxyJump=bastion.data.pm' \
  deploy@data.pm:/srv/data.pm/current/ \
  deploy@staging.data.pm:/srv/data.pm/current/

# copier via bastion quand scp -3 n'est pas disponible (fallback: deux tunnels)
ssh -J bastion.data.pm deploy@data.pm 'tar -C /srv/data.pm/current -cf - .' \
  | ssh -J bastion.data.pm deploy@staging.data.pm 'tar -C /srv/data.pm/current -xf -'

# vérification de bout en bout: calculer et comparer les sommes source/destination
SRC_SUM="$(ssh deploy@data.pm 'sha256sum /srv/data.pm/current/app.tar.zst | cut -d" " -f1')"
DST_SUM="$(ssh deploy@staging.data.pm 'sha256sum /srv/data.pm/current/app.tar.zst | cut -d" " -f1')"
[ "$SRC_SUM" = "$DST_SUM" ] && echo "OK" || { echo "MISMATCH" >&2; exit 1; }

notes

  • -3 (third-party transfer) fait passer les données via votre machine sans qu’elles s’écrivent sur disque local; utile quand les deux serveurs ne se voient pas directement.
  • -o ProxyJump=bastion.data.pm traverse un bastion SSH proprement (équivalent à ssh -J).
  • -p préserve les timestamps et modes; -C compresse; -r copie récursivement; -l limite la bande passante (Kbit/s).
  • scp n’a pas de reprise native; pour des gros volumes ou des liens instables, préférez rsync -a --partial via -e 'ssh -o ProxyJump=...'.
  • assurez-vous d’avoir les clés d’hôte (known_hosts) et d’accès en place pour data.pm, staging.data.pm et bastion.data.pm (voir snippets SSH associés).