1 votes

Comment faire pour qu'une application utilise mon interface eth0:0 ?

Comme dans curL, nous avons une option d'adresse de liaison, nous pouvons télécharger en utilisant une certaine interface

Par exemple, pour télécharger depuis eth0:0 nous utilisons $curl --interface eth0:0 http://www.google.com

De cette façon, mon but est de télécharger des fichiers mais comme curL ne supporte pas le téléchargement segmenté, je ne veux pas l'utiliser. Nous avons une restriction de vitesse sur chaque IP. Pour surmonter cette restriction, je peux démarrer plusieurs interfaces comme celle-ci, et télécharger une partie du fichier à partir de chaque interface.

Comment faire pour qu'un autre gestionnaire de téléchargement comme AXEL se lie à une adresse particulière ? Je demande une idée comme changer les variables dans BASH Shell, de sorte que l'ensemble de Shell se lie à une interface particulière, disons eth0:1...

3voto

user12786 Points 454

On dirait que ce que vous voulez vraiment, c'est une application qui peut télécharger un fichier en plusieurs parties à partir de différentes interfaces et les réunir à la fin. Par exemple, si vous savez que votre fichier fait 100 Mo, et que vous voulez récupérer des morceaux d'environ 10 Mo, vous devriez faire ce qui suit :

1. start a download of bytes 0..10000000 on eth0, saving to filename.part1
2. start a download of bytes 10000001..20000000 on eth0:0, saving to `filename.part2
3. start a download of bytes 20000001..30000000 on eth0:1, saving to filename.part3
...
N-1. wait for all downloads to complete
N. join all filename.part* together to get filename.complete

Je sais. wget peut reprendre un fichier partiellement téléchargé. Je suis presque sûr que cela fonctionne en lisant jusqu'à la fin du fichier existant et en demandant ensuite le fichier, en commençant par l'octet suivant, au serveur.

On dirait que curl prend en charge les téléchargements partiels comme celui-ci en utilisant l'option --range <byterange> option. Vous pourriez donc scriptles étapes ci-dessus comme ceci :

1. curl --interface eth0 --range 0,10000000 http://some.server.com/bigfile -o bigfile.part1
2. curl --interface eth0:0 --range 10000001,20000000 http://some.server.com/bigfile -o bigfile.part2
... 
N. cat bigfile.part* > bigfile

Attention : cela ne fonctionne pas toujours ; si le serveur HTTP/1.1 n'a pas activé la fonction de téléchargement partiel, vous obtiendrez le fichier entier à chaque appel. Voir man curl pour plus de détails sur le --range option.

Edit : correction des plages d'octets dans les exemples

1voto

Rick Kierner Points 504

Ici est un article de blog sur la division d'un téléchargement avec curl. J'ai essayé sous Windows, mais je n'ai pas réussi à le faire fonctionner, mais vous pourriez avoir du succès avec Linux.

0voto

m0hithreddy Points 101

D'emblée, permettez-moi de corriger certaines choses que vous avez dites.

1) curl ne supporte pas le téléchargement de segments -- Curl supporte le téléchargement d'une plage particulière du fichier. Mais d'abord, vous devez vérifier si le serveur supporte le téléchargement d'une plage et si c'est le cas, vous pouvez demander une plage particulière du fichier en passant un en-tête HTTP. Range: bytes=start-end avec option -H de la boucle.

2) Je demande une idée comme changer les variables dans BASH Shell, de sorte que l'ensemble de Shell se lie à une interface particulière. -- Pour la plupart des variables, la définition des variables ne signifiera rien à moins que l'application ne les lise en utilisant des fonctions telles que getenv() (en C).

Une solution probable

Une chose que vous pouvez certainement faire est d'écrire un Shell ShellscriptShell en utilisant curl, vous pouvez utiliser --interface pour se lier à une interface spécifique et --header pour demander une gamme particulière. Vous pouvez ensuite programmer votre téléchargement parmi les interfaces disponibles. Mais attendez ! Vous devez faire beaucoup d'analyse syntaxique pour l'implémenter. Vous voudrez sans doute analyser le fichier ifconfig pour obtenir les interfaces, et vous pouvez vouloir analyser la sortie de curl pour implémenter un tel téléchargeur. De plus, l'application présente un risque élevé d'échec car elle est complètement dépendante de la sortie de certaines applications spécifiques. J'entends par là, ifconfig y curl n'a pas de normes sur la façon dont il produit la sortie, mais HTTP a des normes fixes (RFC). L'analyse syntaxique des messages HTTP présente donc un faible risque d'échec par rapport à certaines applications non standardisées.

Des projets comme Axel ?

J'ai commencé à travailler sur un projet dont le cas d'utilisation est le même que celui que vous avez demandé. Il est entièrement écrit en C. Voici un lien vers mon projet, Multiple Interface Downloader (MID). https://github.com/m0hithreddy/MID .

  • MID utilise l'option de socket SO_BINDTODEVICE pour se lier à une interface spécifique, donc dans la plupart des cas, vous avez besoin des permissions de super utilisateur et de la capacité CAP_NET_RAW (l'utilisateur root en dispose).

  • MID détermine les interfaces réseau à utiliser pour le téléchargement et adopte une répartition en deux étapes pour le téléchargement du contenu.

    • Première étape : Le fichier est réparti entre les interfaces réseau (en temps réel).
    • Deuxième étape : Le fichier est ensuite divisé en plusieurs Demandes de plage HTTP qui découlent de cette interface particulière ( NOTE : Le serveur devrait les soutenir en premier lieu pour rendre tout cela possible).

Le MID prend en charge les protocoles HTTP et HTTPS.

Santé :)

-1voto

dequin Points 113

Faites de eth0:0 la route par défaut au lieu de eth0. La commande :

netstat -rn

vous montrera quelle est votre interface par défaut actuelle. Si ce n'est pas eth0:0, supprimez-la avec

route delete 0.0.0.0

puis l'ajouter avec quelque chose comme

route add default eth0:0

1 votes

Je veux utiliser toutes les interfaces simultanément. Par exemple, dans un terminal, j'utilise eth0:0 et dans l'autre j'utilise eth0:1 Maintenant, est-ce que vous comprenez ce que j'ai l'intention de faire ?

1 votes

Vous avez différents terminaux mais un seul noyau. Le noyau utilise un seul ensemble de règles pour le routage, quelle que soit l'application d'où provient le trafic. Si vous configurez des routes statiques vers différents sous-réseaux ou hôtes individuels, le noyau peut acheminer le trafic par différents ports pour y parvenir. Vous pouvez également configurer Xen qui vous donnera une toute nouvelle adresse IP, une nouvelle plage de ports et une nouvelle table de routage.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X