Aller au contenu

SSH : transfert de fichiers

SSH sert aussi à copier des fichiers de façon chiffrée. Les exemples utilisent un serveur monserveur (alias défini dans Configuration du client).

Fenêtre de terminal
scp fichier.txt monserveur:/tmp/ # poste vers serveur
scp monserveur:/var/log/syslog ./syslog # serveur vers poste
scp -r dossier/ monserveur:/srv/ # dossier complet
scp -P 2222 fichier.txt deploy@serveur.exemple.com:/tmp/ # port différent (P majuscule)
scp -J bastion fichier.txt deploy@10.0.0.20:/tmp/ # via un rebond
scp serveur1:/tmp/a serveur2:/tmp/ # entre deux serveurs (via le poste)

Depuis OpenSSH 9.0, scp utilise le protocole SFTP en interne (plus sûr que l’ancien protocole) ; la syntaxe est inchangée.

Fenêtre de terminal
sftp monserveur
Commande (dans sftp) Rôle
ls, cd, pwd Sur le serveur
lls, lcd, lpwd Sur le poste local (préfixe l)
get fichier Télécharge
put fichier Envoie
get -r dossier / put -r dossier Dossier complet
mkdir, rm, rename Gestion distante
bye ou exit Quitte

Mode non interactif (scripts) :

Fenêtre de terminal
echo "put archive.tar.gz /srv/depot/" | sftp -b - monserveur
sftp -b commandes.txt monserveur

rsync ne transfère que les différences, reprend un transfert interrompu et conserve les droits.

Fenêtre de terminal
rsync -avz --progress dossier/ monserveur:/srv/site/ # copie et synchronise
rsync -avz --delete dossier/ monserveur:/srv/site/ # supprime côté serveur ce qui n'existe plus ici
rsync -avzn --delete dossier/ monserveur:/srv/site/ # SIMULATION (-n) : n'écrit rien
rsync -avz monserveur:/var/backups/ ./sauvegardes/ # serveur vers poste
rsync -avz -e "ssh -p 2222" dossier/ deploy@serveur.exemple.com:/srv/
rsync -az --partial --progress gros.iso monserveur:/tmp/ # reprise d'un gros fichier
rsync -avz --exclude 'node_modules' --exclude '.git' --exclude '.env' dossier/ monserveur:/srv/site/
Option Rôle
-a Mode archive : récursif, droits, dates, liens
-v, -z, --progress Détails, compression, progression
-n (--dry-run) Simulation
--delete Supprime à destination les fichiers absents de la source
--partial Garde les transferts partiels pour les reprendre
--exclude Ignore des fichiers
-e "ssh …" Commande SSH à utiliser (port, clé)
--bwlimit=5000 Limite le débit (Ko/s)
Fenêtre de terminal
sudo apt install sshfs
mkdir -p ~/distant
sshfs monserveur:/srv/site ~/distant # monte le dossier distant
ls ~/distant
fusermount3 -u ~/distant # démonte

Le dossier distant se manipule comme un dossier local (éditeur, cp). Options utiles : -o reconnect,ServerAliveInterval=15, -o ro (lecture seule). Peu adapté aux gros volumes ou aux accès fréquents : préférer rsync pour synchroniser.

Fenêtre de terminal
tar czf - dossier/ | ssh monserveur "cat > /tmp/dossier.tar.gz" # archive envoyée sans fichier intermédiaire
ssh monserveur "tar czf - /srv/site" | tar xzf - -C ./restauration/ # archive récupérée et extraite
ssh monserveur "mysqldump --single-transaction boutique | gzip" > boutique.sql.gz # sauvegarde de base vers le poste

Utilisateur limité au transfert de fichiers (SFTP avec chroot)

Section intitulée « Utilisateur limité au transfert de fichiers (SFTP avec chroot) »

Pour un client qui doit déposer des fichiers sans accès à un shell :

Fenêtre de terminal
sudo groupadd sftponly
sudo useradd -m -s /usr/sbin/nologin -G sftponly client
sudo mkdir -p /srv/sftp/client/depot
sudo chown root:root /srv/sftp /srv/sftp/client # le dossier chrooté doit appartenir à root
sudo chmod 755 /srv/sftp /srv/sftp/client
sudo chown client:client /srv/sftp/client/depot # seul dossier en écriture
Fenêtre de terminal
sudo tee /etc/ssh/sshd_config.d/50-sftp.conf <<'CONF'
Match Group sftponly
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PasswordAuthentication no
CONF
sudo sshd -t && sudo systemctl reload ssh

Ajouter la clé publique du client dans /home/client/.ssh/authorized_keys (droits 700 et 600, propriétaire client). Tests (vérifiés sur Ubuntu 24.04 et 26.04) :

Fenêtre de terminal
sftp client@serveur.exemple.com # affiche « depot »
ssh client@serveur.exemple.com id # refusé : « This service allows sftp connections only. »
  • Utiliser une clé dédiée et restreinte (voir Clés SSH, restrict et command=) pour les transferts automatisés.
  • Toujours simuler (rsync -n) avant --delete.
  • Vérifier l’intégrité des gros transferts : sha256sum fichier des deux côtés.
  • Planifier avec cron ou un timer systemd (voir systemd : timers) en journalisant la sortie.
Symptôme Piste
scp: dest open "…": Permission denied Droits du dossier distant pour l’utilisateur SSH
rsync: command not found côté serveur sudo apt install rsync sur le serveur
rsync error: some files could not be transferred Droits de lecture insuffisants ; consulter les messages précédents
bad ownership or modes for chroot directory Le dossier chrooté (et ses parents) doit appartenir à root
This service allows sftp connections only Normal pour un compte SFTP restreint
sshfs : fusermount: failed to access mountpoint Dossier de montage inexistant, ou déjà monté
Les accents sont abîmés dans les noms de fichiers Locale incohérente (UTF-8 des deux côtés)
  • Manuel : man rsync, man sftp, man scp
  • Suite : Dépannage