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

Publié le 01/01/2015

tagged #Linux , #SSH , #SCP , #SFTP and #Rsync

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 :

  • La mani√®re de se connecter, oui ;
  • La m√©thode de transfert, non !

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 :

  • SFTP = SSH + SFTP-server install√© sur le serveur
  • SCP = SSH + SCP, install√© sur le serveur √©galement.
  • FISH = SSH + dd (et quelques autres utilitaires Unix de base, accessibles sur le serveur).

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,
  3. ...

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:

  • -r pour un transfert r√©cursif. Sans ce param√®tre, seul les fichiers pr√©sents dans le dossier racine seront transf√©r√©s.
  • -P pour avoir le m√™me effet que --partial --progress: une barre de progression s'affiche pour chaque fichier transf√©r√©, et le t√©l√©chargement de fichiers incomplets est repris √† l'endroit o√Ļ il avait √©t√© abandonn√©.
  • -e pour sp√©cifier le shell √† utiliser
  • Les deux derniers param√®tres sont : SOURCE et DESTINATION. Ici, on va se connecter avec l'utilisateur login sur la machine server et rapatrier tous les dossiers qui se trouvent dans path vers le r√©pertoire local qui s'appelle folder.

Parmi les autres paramètres intéressants:

  • -t pour garder les informations de dates de modifications sur les fichiers
  • -v pour entrer dans un mode verbeux
  • -u pour synchroniser les dossiers, en prenant en compte les dates de modifications des fichiers pour savoir s'il doit envoyer une nouvelle version ou non. Attention que ce param√®tre n'a pas d'int√©r√™t si le transfert pr√©c√©dent a √©chou√©: comme le fichier (a moiti√©) transf√©r√© a la m√™me heure et date de modification que le fichier qu'rsync tente d'envoyer, il sera simplement skipp√©, alors qu'il aurait d√Ľ continuer le transfert gr√Ęce au param√®tre -P. Pour une sauvegarde/copie, √©vitez ce param√®tre, sauf si vous √™tes s√Ľr que la copie pr√©c√©dente a r√©ussi.
  • --delete pour supprimer les fichiers qui se trouvent dans la destination, mais pas dans la source
  • -z pour compresser les fichiers et gagner un peu au niveau du transfert.

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é).