SCP
— title: Transferts de fichiers - SCP, SFTP & SSH sont dans un bâteau date: 2015-01-01 taxonomies:
tags: [Linux, SSH, SCP, SFTP, Rsync]
—
# Définitions
J'ai encore appris un truc à la noix aujourd'hui: [SCP](https://fr.wikipedia.org/wiki/Secure_copy) et [SFTP](https://fr.wikipedia.org/wiki/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](www.unix.com/ubuntu/156681-i-want-upload-file-remote-machine-noninteractive-mode-through-sftp.html) (SCP l'est d'office, lui, en non-interactif):
```bash sftp <HOST> -b «EOF put file1 put file2 EOF ```
[Les différences entre tous ces services sont les suivantes](https://unix.stackexchange.com/questions/8707/whats-the-difference-between-sftp-scp-and-fish-protocols) :
* `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
```bash scp -r -P <port> <login>@<server>:/path/to/the/folder . ```
## Envoi d'un fichier vers le serveur
```bash scp -P <port> /path/to/the/file <login>@<server>:<destination_path> ```
## Accélérer le transfert de petits fichiers
```bash 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](https://rsync.samba.org/), 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](http://duplicity.nongnu.org/) et [Deja-Dup](https://launchpad.net/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é).