Copier un fichier d’un serveur à l’autre en le compressant pour la route via NetCat et

J’ai voulu un jour transférer des fichiers entre deux machines et les fichiers je les trouvaient lourds. Habituellement j’aurait utilisé soit rsync ou scp mais cette fois ci je voulait utiliser un processus un peu différent. Pourquoi ne pas compresser le contenu durant le transfert?

Une méthode de compression-transfert-décompression aurait été, traditionnellement, de lancer une commande de création d’archive, attendre qu’elle finisse… (ça peut être long)… puis transférer… (attendre)… puis se loguer sur l’hôte distant. Ensuite décompresser le fichie (ou le conserver as-is).

Rsync est bien il permet de synchroniser BEAUCOUP de fichiers entre des machines et j’aime l’utiliser. Scp est très bien aussi il me permet de transférer des fichiers crées simplement, comme il se doit… Mais pourquoi attendre après les commandes de la procédure d’avant quand on peut tout automatiser en une seule commande?

En tant que Geek moi même, j’aime trouver des solutions élégantes pour faire quelque chose de la sorte sans avoir a attendre après un input.

Dans mon nouveau blogroll j’ai découvert un blogeur qui semble avoir les mêmes intérêts que moi coté hosting et machines serveurs. C’est pour ça que je l’ai ajouté. Ensuite en tant que bon bilingue je vais traduire l’essentiel de son post et le lier comme référence :).

La technique

En gros, il suffit de lancer la commande suivante:

$tar -zcf - ./ | ssh remoteuser@remotehost tar -C /path/to/remote/dir -zxf -

C’est simple que qui se passe.

En fait il crée une archive compressée par tar du dossier courrant (./) ou peu importe le dossier il suffit de le mentionner là.) et envoie “l’archive” au
stdout (standard output) Ensuite le pipe(|), attrape le contenu du stdout) puis appelle ssh(secure shell) pour se connecter en connection sécurisée entre les deux machines par ligne de commande qui exécute presto une autre instance de tar et roule une décompression dans le stdin (aka. standard input).

La seule attrape possible c’est que le serveur distant doit avoir la commande tar disponible dans son path (logue toi sur la machine et si
tar répond… c’est ok. Sinon faites “$which tar” ou “$locate tar” pour trouver le binaire.