J'ai un * nix minimal headless qui ne dispose d' aucun utilitaire en ligne de commande pour le téléchargement de fichiers (par exemple, no curl, wget, etc.). Je n'ai que bash.
Comment puis-je télécharger un fichier?
Idéalement, j'aimerais une solution qui fonctionnerait sur une large gamme de * nix.
bash
command-line
web
Chris Snow
la source
la source
gawk
Réponses:
Si vous avez bash 2.04 ou une version ultérieure avec le
/dev/tcp
pseudo-périphérique activé, vous pouvez télécharger un fichier à partir de bash lui-même.Collez le code suivant directement dans un shell bash (vous n'avez pas besoin de sauvegarder le code dans un fichier pour l'exécuter):
Ensuite, vous pouvez l'exécuter à partir du shell comme suit:
Source: réponse de Moreaki lors de la mise à niveau et de l'installation de packages via la ligne de commande cygwin?
Mise à jour: comme mentionné dans le commentaire, l'approche décrite ci-dessus est simpliste:
read
volonté supprime les barres obliques inverses et les grands espaces.$line
va glob.la source
while read
comme celui-ci, les barres obliques inverses et les espaces blancs les plus importants et Bash ne peuvent pas gérer les octets NUL de manière très satisfaisante, de sorte que les fichiers binaires sont supprimés. Et non$line
cité va glob ... Rien de tout cela je vois mentionné dans la réponse.Utilisez le lynx.
C'est assez commun pour la plupart des Unix / Linux.
-dump: vide le premier fichier sur stdout et quitte
Ou netcat:
Ou telnet:
la source
lynx -source
est plus proche de wgetAdapté de Chris Snow answer Cela peut également gérer des fichiers de transfert binaires
Vous pouvez tester des fichiers binaires comme celui-ci
la source
cat
. Je ne suis pas sûr que ce soit de la triche (puisqu'il ne s'agit pas uniquement de la coque) ou une solution intéressante (puisqu'ilcat
s'agit d'un outil standard, après tout). Mais @ 131, vous voudrez peut-être ajouter une note expliquant pourquoi cela fonctionne mieux que les autres solutions proposées ici.En prenant strictement le " juste Bash et rien d' autre ", voici une adaptation des réponses précédentes ( @ Chris's , @ 131 ) qui n'appelle aucun utilitaire externe (même les plus classiques) mais fonctionne également avec des fichiers binaires:
Utilisez avec
download http://path/to/file > file
.Nous traitons avec les octets NUL avec
read -d ''
. Il lit jusqu'à un octet NUL et renvoie true s'il en a trouvé un, false s'il ne l'a pas trouvé. Bash ne peut pas gérer les octets NUL dans les chaînes. Ainsi, lorsqu'ilread
renvoie true, nous ajoutons manuellement l'octet NUL lors de l'impression et lorsqu'il renvoie false, nous savons qu'il n'y a plus d'octets NUL, ce qui devrait être la dernière donnée. .Testé avec Bash 4.4 sur des fichiers avec des NUL au milieu et se terminant par zéro, un ou deux NUL, ainsi qu'avec les binaires
wget
et lescurl
binaires de Debian. Lewget
téléchargement du fichier binaire de 373 ko a pris environ 5,7 secondes. Une vitesse d'environ 65 ko / s ou un peu plus de 512 ko / s.En comparaison, la solution cat de @ 131 se termine en moins de 0,1 s, soit presque cent fois plus vite. Pas très surprenant, vraiment.
C'est évidemment idiot, car sans utiliser d'utilitaires externes, nous ne pouvons pas faire grand chose avec le fichier téléchargé, pas même le rendre exécutable.
la source
echo
etprintf
comme éléments intégrés (il a besoin d'un élément intégréprintf
à implémenterprintf -v
)Si vous avez ce paquet libwww-perl
Vous pouvez simplement utiliser:
la source
lynx
solution, étant donné que Perl a probablement plus de chances d'être préinstallé que Lynx.Utilisez plutôt le téléchargement via SSH à partir de votre machine locale
Une boîte "nix * minimal sans tête" signifie que vous y êtes probablement en SSH. Vous pouvez donc également utiliser SSH pour y télécharger . Ce qui est fonctionnellement équivalent au téléchargement (de progiciels, etc.), sauf si vous souhaitez qu'une commande de téléchargement soit incluse dans un script sur votre serveur sans affichage.
Comme indiqué dans cette réponse , vous devez exécuter les opérations suivantes sur votre ordinateur local pour placer un fichier sur votre serveur sans tête distant:
Téléchargement plus rapide via SSH depuis une troisième machine
L'inconvénient de la solution ci-dessus par rapport au téléchargement est une vitesse de transfert plus faible, car la connexion avec votre ordinateur local a généralement une bande passante bien inférieure à la connexion entre votre serveur sans interface utilisateur et d'autres serveurs.
Pour résoudre ce problème, vous pouvez bien sûr exécuter la commande ci-dessus sur un autre serveur disposant d'une bande passante suffisante. Pour rendre cela plus confortable (en évitant une connexion manuelle sur la troisième machine), voici une commande à exécuter sur votre machine locale .
Pour être sûr, copiez et collez cette commande, y compris le caractère d'espacement
' '
. Voir les explications ci-dessous pour la raison.Explications:
La commande va ssh sur votre troisième machine
intermediate-host
, commencera à télécharger un fichier là-bas viawget
, et commencera à le téléchargertarget-host
via SSH. Le téléchargement et le téléchargement utilisent la bande passante de votreintermediate-host
et se produisent en même temps (en raison des équivalents Bash pipe), donc les progrès seront rapides.Lorsque vous utilisez cette option, vous devez remplacer les deux connexions au serveur (
user@*-host
), le mot de passe de l'hôte cible (yourpassword
), l'URL de téléchargement (http://example.com/…
) et le chemin de sortie sur votre hôte cible (/path/to/output-file.zip
) avec les propres valeurs appropriées.Pour les
-T -e none
options SSH lors de son utilisation pour transférer des fichiers, voir ces explications détaillées .Cette commande est destinée aux cas où vous ne pouvez pas utiliser le mécanisme d'authentification par clé publique de SSH - elle survient toujours avec certains fournisseurs d'hébergement partagé, notamment Host Europe . Pour automatiser encore le processus, nous comptons sur
sshpass
pouvoir fournir le mot de passe dans la commande. Il doitsshpass
être installé sur votre hôte intermédiaire (sudo apt-get install sshpass
sous Ubuntu).Nous essayons d'utiliser
sshpass
de manière sécurisée, mais ce ne sera toujours pas aussi sécurisé que le mécanisme SSH de pubkey (ditman sshpass
). En particulier, nous fournissons le mot de passe SSH non pas en tant qu'argument de ligne de commande, mais via un fichier, qui est remplacé par une substitution de processus bash afin de s’assurer qu’il n’existe jamais sur le disque. Leprintf
est un bash intégré, en s'assurant que cette partie du code ne s'affiche pas en tant que commande séparée enps
sortie car cela exposerait le mot de passe [ source ]. Je pense que cette utilisation desshpass
est tout aussi sécurisée que lasshpass -d<file-descriptor>
variante recommandée dansman sshpass
, car bash le mappe de manière interne vers un tel/dev/fd/*
descripteur de fichier. Et cela sans utiliser un fichier temporaire [ source]. Mais pas de garanties, j'ai peut-être oublié quelque chose.Encore une fois pour sécuriser l'
sshpass
utilisation, nous devons empêcher l'enregistrement de la commande dans l'historique bash de votre ordinateur local. Pour cela, la commande entière est précédée d'un caractère d'espacement, qui a cet effet.La
-o StrictHostKeyChecking=no
pièce empêche l'échec de la commande si elle ne s'est jamais connectée à l'hôte cible. (Normalement, SSH attendrait alors que l’utilisateur confirme la tentative de connexion. Nous le faisons quand même.)sshpass
attend une commandessh
ouscp
comme dernier argument. Nous devons donc réécrire lawget -O - … | ssh …
commande typique dans un formulaire sans tuyau bash, comme expliqué ici .la source
Basé sur la recette de @Chris Snow. J'ai fait quelques améliorations:
Voici le code:
la source
echo -en "GET ${PATH} HTTP/1.1\r\nHost: ${HOST}\r\n${tag}\r\n\r\n" >&3
,${tag}
n'est pas spécifié.tag
variable est correct, cela fonctionne bien maintenant.