Linux / Commande sftp : transférer des fichiers via SSH

sftp est un programme qui transfère des fichiers et gère des fichiers distants via une connexion SSH (Secure Shell). Le format de connexion de base est sftp user@host, et il peut utiliser la vérification de clé hôte SSH et l'authentification par clé publique telles quelles.

sftp user@example.com

SFTP (SSH File Transfer Protocol) est distinct de FTP (File Transfer Protocol) et de FTPS, qui protège FTP avec TLS (Transport Layer Security). Le sous-système SFTP de SSH doit être activé sur le serveur, et il utilise généralement le même port TCP que SSH.

Fonctionnalités de SFTP et vérifications avant de se connecter

Le sftp d'OpenSSH effectue des transferts de fichiers sur une connexion SSH sécurisée et peut utiliser des fonctionnalités SSH telles que l'authentification par clé publique, les fichiers de configuration SSH et les serveurs relais. Toutes les options et commandes interactives se trouvent dans le manuel officiel sftp d'OpenSSH.

  • Adresse du serveur et port SSH
  • Compte utilisateur pour se connecter
  • Mot de passe ou clé privée SSH
  • Chemin de confiance pour vérifier l'empreinte de la clé hôte du serveur
  • Autorisations de lecture et d'écriture pour le répertoire distant

Les domaines example.com, sftp.example.com et les autres adresses d’exemple sont des emplacements fictifs à remplacer par votre serveur. Installez le client OpenSSH de votre distribution si sftp est absent. Les fichiers et dossiers cités plus bas doivent exister, et le serveur doit autoriser le sous-système SFTP pour le compte choisi.

Comparez l’empreinte de la clé hôte affichée lors de la première connexion avec la valeur reçue de l'administrateur du serveur ou d'une interface de gestion de confiance. Si vous l'approuvez sans vérification, vous pourriez manquer une attaque de type man-in-the-middle ou vous connecter au mauvais serveur.

Se connecter au serveur

Connexion de base

sftp user@example.com

Une fois connecté, l'invite sftp> apparaîtra, vous permettant de saisir des commandes interactives. Cette invite est à des fins d'illustration, et seules les commandes elles-mêmes sont montrées dans les exemples de code ci-dessous.

Utiliser un autre port SSH

sftp -P 2222 user@example.com

L'option de port pour SFTP est en majuscules -P. En minuscules -p est une option différente qui demande la préservation de l'heure de modification, de l'heure d'accès et des permissions du fichier, donc ne les confondez pas.

Spécifier une clé privée

sftp -i ~/.ssh/id_ed25519 user@example.com

Restreignez les permissions de votre fichier de clé privée afin que les autres utilisateurs ne puissent pas le lire, et si possible, définissez une phrase de passe pour l'utiliser avec un agent SSH. Ne copiez pas votre clé privée sur des serveurs ou des répertoires partagés.

Distinction des chemins locaux et distants

En mode interactif SFTP, il existe des commandes séparées qui s'exécutent sur le serveur distant et sur l'ordinateur local.

Commande Cible Description
pwd Distant Affiche le répertoire actuel du serveur distant.
lpwd Local Affiche le répertoire actuel de l'ordinateur sur lequel SFTP s'exécute.
cd path Distant Change le répertoire distant.
lcd path Local Change le répertoire local.
ls Distant Affiche la liste des fichiers distants.
lls Local Affiche la liste des fichiers locaux.
mkdir Distant Crée un répertoire distant.
lmkdir Local Crée un répertoire local.

Il est bon de vérifier pwd et lpwd avant de commencer le travail afin d'éviter d'envoyer des fichiers au mauvais emplacement.

Téléchargement des fichiers

Téléchargement d'un seul fichier

get reports/daily.csv

Vous pouvez spécifier le chemin d'enregistrement local comme deuxième argument.

get reports/daily.csv ./download/daily.csv

Le répertoire local ./download doit déjà exister ; vous pouvez le créer depuis l’invite SFTP avec lmkdir download, puis vérifier son emplacement avec lpwd. Les commandes get peuvent remplacer un fichier local du même nom : choisissez un dossier de destination adapté.

Téléchargement de plusieurs fichiers et répertoires

get reports/*.csv
get -R reports

Les caractères génériques peuvent correspondre aux noms de fichiers distants. Lors du téléchargement de répertoires de manière récursive, SFTP ne suit pas les liens symboliques dans l'arborescence, et les options de support peuvent varier en fonction des versions du serveur et du client.

Reprise des téléchargements interrompus

reget archive.tar.zst

Ou vous pouvez reprendre les transferts partiels avec get -a. Cela suppose que le fichier local partiel correspond exactement au début du fichier distant, donc si le fichier distant a changé, le résultat peut être corrompu. Pour les fichiers importants, comparez les sommes de contrôle après le transfert.

Téléversement de fichiers

Téléversement d’un fichier unique

put ./release.tar.zst

Vous pouvez spécifier le chemin de sauvegarde ou le nom distant comme deuxième argument.

put ./release.tar.zst uploads/release.tar.zst

Téléversement d’un répertoire de manière récursive

put -R ./assets uploads/assets

Comme les fichiers existants peuvent être écrasés, vérifiez d'abord le chemin distant. S'il s'agit d'un répertoire vers lequel plusieurs utilisateurs déploient simultanément, il est plus sûr de téléverser avec un nom temporaire puis d'utiliser la procédure de renommage atomique prise en charge par le serveur.

Reprise des téléversements interrompus

reput ./large-image.img

put -a tente également de reprendre les téléchargements partiels. Si le fichier partiel distant ne correspond pas au début du fichier local, un fichier corrompu peut être créé, donc vérifiez les modifications et comparez l’empreinte après le transfert.

Gestion des chemins, espaces et noms de fichiers

Mettez entre guillemets les chemins contenant des espaces.

get "Monthly Reports/September Report.csv"
put "./Release Files/app package.tar.zst" uploads/

L'interprétation des commandes interactives dans SFTP n'est pas exactement la même que dans un shell classique. Pour les noms de fichiers contenant des caractères génériques ou des barres obliques inverses, vérifiez d'abord le nom exact dans la liste, et pour l'automatisation, il est plus sûr d'utiliser des noms de fichiers simples et prévisibles.

Gestion des informations de connexion avec les fichiers de configuration SSH

Regroupez les options répétitives sous l'entrée Host

En écrivant des alias, des utilisateurs, des ports et des chemins de clés dans ~/.ssh (guide en anglais)/config, vous pouvez vous connecter rapidement.

Host fileserver
    HostName sftp.example.com
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
sftp fileserver

Ne mettez pas de mots de passe ni le contenu des clés privées dans le fichier de configuration. Conservez une copie avant modification et restaurez les lignes modifiées si l’alias ne convient plus. Sauf exception documentée, OpenSSH retient la première valeur obtenue pour une directive ; placez donc les règles précises avant les valeurs générales. Le manuel de ssh_config décrit aussi la priorité des options en ligne de commande, du fichier utilisateur et du fichier système. Restreignez les permissions du fichier et vérifiez la priorité entre les configurations système et utilisateur.

Connexion via un hôte relais

sftp -J bastion.example.com user@internal.example.com

-J utilise la fonction ProxyJump de SSH. Vérifiez séparément les clés d'hôte de l'hôte intermédiaire et du serveur cible, et n'utilisez le transfert d'agent que lorsque c'est nécessaire.

Envoi automatique en mode batch

Création d'un fichier batch

Configurez et vérifiez d’abord l’alias fileserver avec les paramètres de votre serveur. L’exemple suppose un dossier distant incoming déjà créé et accessible en écriture depuis le répertoire de connexion. Pour cet essai, vérifiez que report.tmp et report.csv n’y existent pas ; dans un traitement concurrent, utilisez des noms temporaires uniques.

Dans Bash, préparez un nouveau dossier local, un fichier de valeurs séparées par des virgules (CSV) et le fichier upload.sftp :

sftp_start=$PWD
sftp_demo=$(mktemp -d) || exit 1
cd "$sftp_demo" || exit 1
mkdir exports
printf 'id,status\n1,ready\n' > exports/report.csv
cat > upload.sftp <<'SFTP'
cd incoming
lcd ./exports
put report.csv report.tmp
rename report.tmp report.csv
bye
SFTP

Téléverser d'abord avec un nom temporaire puis le renommer peut réduire le risque que d'autres processus lisent un fichier en cours de traitement comme un fichier terminé. L’atomicité dépend de la prise en charge du renommage dans le même système de fichiers sur le serveur. Cette méthode ne garantit ni le remplacement d’un nom existant sur tous les serveurs, ni l’écriture durable sur le support en cas de panne.

Exécution du fichier batch

sftp -b upload.sftp fileserver
sftp_result=$?
printf 'sftp exit: %s\n' "$sftp_result"

Un statut 0 indique la réussite de ce traitement ; un statut non nul exige de lire le diagnostic et de vérifier les fichiers effectivement présents avant une reprise. En cas de transfert partiel, ne supposez pas que le renommage final a eu lieu.

Le mode batch ne doit pas dépendre de l'interaction de l'utilisateur pour demander un mot de passe. Utilisez un compte dédié restreint et l'authentification par clé publique, et limitez les privilèges de la clé, les origines d'accès et les chemins autorisés selon la politique du serveur. Ne mettez pas de mots de passe dans les scripts ou les lignes de commande.

Exécutez la commande depuis le dossier contenant upload.sftp et exports. En cas de réussite, le serveur contient incoming/report.csv, avec les deux lignes id,status et 1,ready, et le nom temporaire report.tmp a disparu. Une session SFTP permet de vérifier avec ls -l incoming/report.csv, puis de télécharger le fichier dans un autre emplacement pour comparer son contenu.

Après l’essai, revenez au dossier initial avec cd "$sftp_start". Supprimez uniquement les fichiers d’essai identifiés, localement et sur le serveur, si leur conservation n’est plus nécessaire ; changer le dossier local ne supprime pas les copies distantes.

Comprendre la gestion des échecs

En mode batch, si des commandes clés telles que get, put ou rename échouent, l'opération s'arrête généralement. Vous pouvez ignorer les échecs en plaçant un - avant la commande, mais utilisez-le avec parcimonie, car cela peut donner l'impression que l'opération a réussi même si des fichiers nécessaires sont manquants.

En automatisation, vous devez vérifier le statut de sortie du processus SFTP, la taille des fichiers transférés et les sommes de contrôle si possible, et établir des politiques de notification et de reprise en cas d'échec.

Liste de contrôle de sécurité et opérationnelle

  • Clé de l'hôte : Vérifiez l'empreinte via un canal fiable lors des premières connexions et des changements de clé.
  • Authentification : Pour l'automatisation, utilisez une clé publique à portée limitée et un compte dédié au lieu des mots de passe.
  • Clé privée : limitez ses permissions et ne la déposez pas dans un espace partagé ni sur le serveur distant. Gérez sa sauvegarde chiffrée selon votre politique de sécurité.
  • Permissions de chemin : Restreignez l'accès afin que le compte de téléversement ne puisse atteindre que les répertoires nécessaires.
  • Écraser : Vérifiez le chemin cible et les fichiers existants, et utilisez des noms temporaires ainsi qu'une politique de conservation des versions.
  • Intégrité : Pour les transferts importants, générez et comparez des sommes de contrôle fiables des deux côtés.
  • Journal : Les réussites et échecs des transmissions et leurs cibles sont enregistrés, mais les mots de passe, clés privées et contenus des fichiers sensibles ne sont pas conservés.

Comparer sftp, scp et rsync

Outils Situations appropriées Fonctionnalités
sftp Gestion de fichiers interactive et transfert standardisé Fournit la liste à distance, la navigation dans les répertoires, la reprise et les commandes par lot.
scp Copie de fichiers simple Facile à copier avec une commande en ligne, mais les fonctionnalités de gestion à distance interactive sont limitées.
rsync Synchronisation répétée et grands répertoires Fournit le transfert des fichiers modifiés, des règles d'exclusion et la synchronisation de suppression, mais nécessite généralement un programme rsync accessible sur les deux machines lors d’un transfert via SSH. Un compte limité au sous-système SFTP ne suffit pas.

L'utilisation de SSH seule ne rend pas automatiquement les permissions de compte et les procédures de déploiement sécurisées. Choisissez en fonction de l'objectif de transmission et de la méthode de récupération en cas de panne.

Questions fréquemment posées

SFTP est-il un FTP avec TLS appliqué ?

Non. SFTP est le protocole de transfert de fichiers SSH et fonctionne sur une connexion SSH. FTPS est une méthode distincte qui applique TLS à FTP, avec des paramètres de serveur et des structures de ports différents.

Pourquoi l'erreur Connexion refusée se produit-elle ?

L'adresse ou le port peut être incorrect, le service SSH peut ne pas écouter, ou un pare-feu peut rejeter la connexion. Vérifiez l'adresse du serveur, le port -P en majuscules, l'état du service SSH et les politiques réseau.

Que dois-je faire si "Permission denied" apparaît ?

Vous devez distinguer si l'authentification elle-même a échoué ou s'il y a un accès insuffisant aux fichiers après la connexion. Vérifiez les informations de diagnostic de connexion avec sftp -v, mais ne partagez pas les noms d'utilisateur, les chemins et les détails du serveur dans des journaux publics.

Comment puis-je vérifier que le téléversement est complet ?

Vérifiez le statut de sortie et la taille des fichiers distants, et calculez et comparez les sommes de contrôle comme SHA-256 pour les fichiers importants sur les systèmes locaux et distants. Si le compte n’autorise pas les commandes arbitraires, vous pouvez télécharger la copie distante puis comparer localement les empreintes. Si la lecture est aussi interdite, une interface de vérification ou une procédure côté serveur peut être nécessaire.

Résumé

Après vous être connecté avec sftp user@host, utilisez get pour le téléchargement et put pour le téléversement. Distinguer pwd et lpwd, ainsi que cd et lcd, peut aider à réduire les erreurs avec les chemins distants et locaux.

Dans l'automatisation opérationnelle, les points clés sont l'authentification par clé publique, la vérification de la clé de l'hôte, et le contrôle du statut de sortie des lots et de l'intégrité des fichiers. Ne stockez pas les mots de passe dans les scripts ; limitez la plage de transfert avec un compte dédié et des privilèges minimaux.