Transferts de fichiers - SCP, SFTP & SSH sont dans un bâteau

Publié le 1 janv. 2015

Définitions

J’ai encore appris un truc à la noix aujourd’hui: SCP et SFTP ne sont pas du tout équivalents pour l’envoi de documents sur un serveur en se connectant avec SSH :

SCP ne fait que copier les fichiers; SFTP permet de gérer plus finement (en mode interactif, si besoin) les fichiers et d’explorer l’arborescence si besoin.

SFTP doit être activé manuellement dans le fichier /etc/ssh/sshd_config alors qu’SCP pourra être utilisé dès qu’une connexion SSH sera fonctionnelle. [^1]

Le truc à savoir, c’est qu’il est possible d’autoriser une connexion SSH, empêcher l’utilisation d’un shell, et autoriser malgré tout le protocole SFTP. En gros, on peut donc renvoyer l’utilisateur chez lui s’il se connecte au shell, mais l’autoriser s’il s’agit uniquement d’un transfert de fichiers (et oui : SCP ne sert qu’au transfert de fichiers… Mais comme la connexion semble être ouverte, le serveur vous enverra dans les ronces).

Pour passer SFTP en mode non-interactif, on peut procéder comme ceci (SCP l’est d’office, lui, en non-interactif):

sftp <HOST> -b <<EOF
put file1
put file2
EOF

Les différences entre tous ces services sont les suivantes :

Transferts

Téléchargement d’un répertoire à partir du serveur

scp -r -P <port> <login>@<server>:/path/to/the/folder .

Envoi d’un fichier vers le serveur

scp -P <port> /path/to/the/file <login>@<server>:<destination_path>

Accélérer le transfert de petits fichiers

root@nas:/backup/kimsufi# tar -cpf - fred | pv | ssh <user>@<server> "tar -xpf -"
<user>@<server>'s password:
54.9MiB 0:00:29 [2.25MiB/s]

Bien plus rapide que scp, surtout si beaucoup de petits fichiers.

pv, c’est juste pour voir ou on en est.

RSYNC

Pour transférer des fichiers de manière sécurisé, rien de mieux qu’SSH (ou qu’un disque externe coulé dans du béton. Au choix). SCP permet de transférer des fichiers au travers du protocole SSH, mais ne gère pas la reprise d’un transfert échoué. Pour plus de fonctionnalités et un meilleur contrôle des transferts, il existe rsync, qui offre à nos petits yeux ébahis plein de nouvelles fonctionnalités super utiles:

  1. La reprise de transfert en cas de foirage complet,
  2. La synchronisation de dossiers,

C’est un outil de sauvegarde pratique, sur lequel se basent notamment Duplicity et Deja-Dup.

Utilisation

$ rsync -r -P -e ssh login@server:path/ folder/

Dans l’exemple ci-dessus, les paramètres sont:

Parmi les autres paramètres intéressants:

Attention également aux / après les chemins vers les répertoires. Oubliez le, et cela créera un nouveau répertoire dans le répertoire cible. Ajoutez le pour ne synchroniser que le contenu.

En conclusion

En combinant tous les paramètres, ma commande rsync ressemble est la suivante:

rsync -rtv -P -e "ssh -p 11111" my_folder/ login@server:path/ --exclude ".*" --delete

Notes

[^1] Bon, j’ai découvert en 2023 qu’en fait, non : un fournisseur nous oblige à envoyer des fichiers via SFTP ; j’ai voulu utiliser SCP et je me suis fait jeter par un message type SCP is disabled. Je ne pensais pas que c’était possible (ni même souhaité).