Besoin d'aide script en bash (transfert ssh multific d'un coup)
Fermé
gnugo
-
25 juin 2013 à 16:34
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 - 19 juil. 2013 à 14:38
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 - 19 juil. 2013 à 14:38
A voir également:
- Besoin d'aide script en bash (transfert ssh multific d'un coup)
- Script vidéo youtube - Guide
- We transfert - Guide
- Comment télécharger toutes les photos de google photos d'un coup ? - Guide
- Transfert d'appel ooredoo ✓ - Forum Mobile
- Jeter un coup d'oeil snap - Forum Snapchat
5 réponses
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 418
25 juin 2013 à 18:17
25 juin 2013 à 18:17
Salut,
Tu compresses tes fichiers individuellement au départ :
Tu crées une archive tar à la volée que tu envoies via ssh et tu la détarres toujours à la volée dans le répertoire de ton choix :
Tu compresses tes fichiers individuellement au départ :
gzip *
Tu crées une archive tar à la volée que tu envoies via ssh et tu la détarres toujours à la volée dans le répertoire de ton choix :
tar zcf - * | ssh user@serveur 'cd /chemin/ ; tar xzf -'
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
29 juin 2013 à 12:38
29 juin 2013 à 12:38
hello
les fichiers sont compressés, envoyés dans base64 précédés d'une entête avec le nom, qui permet de recréer le fichier avec awk.
essayer ça:
les fichiers sont compressés, envoyés dans base64 précédés d'une entête avec le nom, qui permet de recréer le fichier avec awk.
essayer ça:
for F in * ; do echo ++++++++++++ $F.gz ; gzip -c $F | base64 ; done | ssh user@server "cd /dest ; awk '/^+++++++/ {f=$2; next} {print | \"base64 -d > \" f}"(j'ai pas testé avec ssh, problèmes de " et de ',sûrement)
Merci!
Belle solution!
Je vais essayer de l'appliquer
Juste un regret, le base64 qui augmente la taille des données à transférer. J'aimerais bien m'en passer mais je suppose que awk aura du mal à lire du binaire ( et ça deviendrait dangereux car les caractères +++++ ne seraient plus réservés qu'à l'en-tête.
... peut être en donnant nom de fichier + taille en octets pour séparer mais ça me parait impossible vu qu'on ne connait pas la taille avant de zipper le fichier
...Le plus simple serait d'utiliser quelquechose de plus performant que base64 qui nous laisse un caractère non utilisé pour notre en-tête (au pire on pourra utiliser autre chose qu'awk à l'arrivée si la lecture de flux binaire pose problème).
Si vous avez une idée je suis preneur :) )
Encore merci !
Belle solution!
Je vais essayer de l'appliquer
Juste un regret, le base64 qui augmente la taille des données à transférer. J'aimerais bien m'en passer mais je suppose que awk aura du mal à lire du binaire ( et ça deviendrait dangereux car les caractères +++++ ne seraient plus réservés qu'à l'en-tête.
... peut être en donnant nom de fichier + taille en octets pour séparer mais ça me parait impossible vu qu'on ne connait pas la taille avant de zipper le fichier
...Le plus simple serait d'utiliser quelquechose de plus performant que base64 qui nous laisse un caractère non utilisé pour notre en-tête (au pire on pourra utiliser autre chose qu'awk à l'arrivée si la lecture de flux binaire pose problème).
Si vous avez une idée je suis preneur :) )
Encore merci !
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
Modifié par dubcek le 17/07/2013 à 16:41
Modifié par dubcek le 17/07/2013 à 16:41
base64 encode les fichiers compressés, donc de tailles bien diminuées
on pourrait mettre la taille dans l'entête et utiliser dd pour lire exactement le nombre de bytes
on pourrait mettre la taille dans l'entête et utiliser dd pour lire exactement le nombre de bytes
Mais l'en-tête est envoyée avant le fichier et on ne peut pas connaitre la taille avant d'avoir zippé tout le fichier (pas question de l'écrire temporairement sur disque ou en mémoire, il doit partir le plus vite possible dans le flux par le pipe) :/
Ta 1ere solution est vraiment bonne je pense, il faudrait juste trouver mieux que ce base64 (idéalement un base255 qui utilise tous les caractères possibles sauf 1, par exemple le '\0', qu'on utilisera pour séparer l'en-tête)
Ta 1ere solution est vraiment bonne je pense, il faudrait juste trouver mieux que ce base64 (idéalement un base255 qui utilise tous les caractères possibles sauf 1, par exemple le '\0', qu'on utilisera pour séparer l'en-tête)
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
18 juil. 2013 à 09:49
18 juil. 2013 à 09:49
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
19 juil. 2013 à 13:38
19 juil. 2013 à 13:38
testé avec un fichier binaire (tar) 135 Mb, compressé 53 Mb, base64 72 Mb, b85 67 Mb (mais très long)
jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
934
Modifié par jisisv le 17/07/2013 à 16:22
Modifié par jisisv le 17/07/2013 à 16:22
Inspire-toi de ceci:
Gates gave ^H sold you the windows.
GNU gave us the whole house.(Alexandrin)
johand@osiris: ~/tmp $ (tar -czf - *) | ssh localhost '(mkdir ~/brol; cd ~/brol ; tar -xzf -)'
Gates gave ^H sold you the windows.
GNU gave us the whole house.(Alexandrin)
Ça fait une archive compressée et ensuite on est obligé de décompresser l'archive pour ensuite recompresser les fichiers un par un.
C'est pour ça que je n'utilise pas d'archiveur comme tar qui ne permettent pas de faire cela.
Je cherche à obtenir des fichiers compressés individuellement sur le serveur d'arrivée, avec une compression faite une seule fois et sur le serveur de départ, le tout dans un seul flux ssh
Donc à aucun moment je ne suis censé décompresser :)
C'est pour ça que je n'utilise pas d'archiveur comme tar qui ne permettent pas de faire cela.
Je cherche à obtenir des fichiers compressés individuellement sur le serveur d'arrivée, avec une compression faite une seule fois et sur le serveur de départ, le tout dans un seul flux ssh
Donc à aucun moment je ne suis censé décompresser :)
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
17 juil. 2013 à 16:42
17 juil. 2013 à 16:42
les fichiers ne sont plus compressés à l'arrivée
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Flachy Joe
Messages postés
2103
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
21 novembre 2023
260
17 juil. 2013 à 19:46
17 juil. 2013 à 19:46
Une idée : installer un serveur de partage sur la destination et "l'entunneler" par ssh. https://www.howtoforge.com/nfs_ssh_tunneling
Tu peux définir directement le point de montage comme destination de la compression et tu t'embêtes pas à créer un pseudo protocole de transfert.
Tu peux définir directement le point de montage comme destination de la compression et tu t'embêtes pas à créer un pseudo protocole de transfert.
Flachy Joe
Messages postés
2103
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
21 novembre 2023
260
19 juil. 2013 à 14:38
19 juil. 2013 à 14:38
Avec sshfs il n'y a pas besoin de partage nfs :
Si tu veux faire transiter tes fichiers par plusieurs serveur, il faut monter le répertoire de destination sur le serveur 2 puis le point de montage du serveur 2 sur le serveur 1 et enfin monter le point de montage du serveur 1 sur le client. Les actions de montage pouvant se faire à travers ssh, tu peux tout mettre en place dans le script lancé sur le client.
sudo apt-get install sshfs mkdir my_ssh #création du point de montage sshfs user@server: ./my_ssh/ #montage find . -maxdepth 1 -type f -print -exec bash -c "gzip -c '{}' > './my_ssh/{}.gz' &" \; #compressions asynchrones fusermount -u ./my_ssh #démontage rmdir ./my_ssh
Si tu veux faire transiter tes fichiers par plusieurs serveur, il faut monter le répertoire de destination sur le serveur 2 puis le point de montage du serveur 2 sur le serveur 1 et enfin monter le point de montage du serveur 1 sur le client. Les actions de montage pouvant se faire à travers ssh, tu peux tout mettre en place dans le script lancé sur le client.
25 juin 2013 à 19:25
Le souci c'est justement que je ne peux pas compresser tous les fichiers au départ car cela implique de les enregistrer sur le disque du serveur.
Il me faut impérativement cette compression à la volée d'où mon problème :/