Ich habe ein minimales kopflos * nichts , das nicht hat keine Befehlszeilen - Dienstprogramme für das Herunterladen von Dateien (zB keine Locke, wget, etc). Ich habe nur Bash.
Wie kann ich eine Datei herunterladen?
Im Idealfall hätte ich gerne eine Lösung, die in einer Vielzahl von * nix funktioniert.
bash
command-line
web
Chris Snow
quelle
quelle
gawk
Antworten:
Wenn Sie Bash 2.04 oder höher mit
/dev/tcp
aktiviertem Pseudogerät haben, können Sie eine Datei von Bash selbst herunterladen.Fügen Sie den folgenden Code direkt in eine Bash-Shell ein (Sie müssen den Code nicht in einer Datei speichern, um ihn auszuführen):
Dann können Sie es wie folgt aus der Shell ausführen:
Quelle: Moreakis Antwort: Aktualisieren und Installieren von Paketen über die Cygwin-Befehlszeile?
Update: Wie im Kommentar erwähnt, ist der oben beschriebene Ansatz einfach:
read
Wille verwirft Backslashes und führende Leerzeichen.$line
Wille glob.quelle
while read
Auf diese Weise werden Backslashes und führende Whitespaces in den Papierkorb verschoben, und Bash kann mit NUL-Bytes nicht sehr gut umgehen, sodass Binärdateien ausgegeben werden. Und nicht zitiert$line
wird glob ... Nichts davon sehe ich in der Antwort erwähnt.Verwenden Sie Luchs.
Es ist für die meisten Unix / Linux-Betriebssysteme ziemlich verbreitet.
-dump: speichert die erste Datei in stdout und beendet sie
Oder netcat:
Oder telnet:
quelle
lynx -source
ist näher zu wgetAdaptiert von Chris Snow answer Dies kann auch binäre Übertragungsdateien verarbeiten
Sie können solche Binärdateien testen
quelle
cat
. Ich bin mir nicht sicher, ob das Schummeln ist (da es nicht nur die Shell ist) oder eine gute Lösung (schließlichcat
ist es ein Standardwerkzeug). Bei @ 131 möchten Sie möglicherweise einen Hinweis hinzufügen, warum dies besser funktioniert als die anderen Lösungen hier.Unter dem „ nur Bash und nichts anderes “ streng, hier ist eine Anpassung der früherer Antworten ( @ Chris , @ 131 ist ) , die keine externen Versorgungs nicht nennen (auch nicht Standard ist) , sondern arbeitet auch mit binären Dateien:
Verwenden Sie mit
download http://path/to/file > file
.Wir beschäftigen uns mit NUL Bytes mit
read -d ''
. Es liest bis zu einem NUL-Byte und gibt true zurück, wenn es eines gefunden hat, false, wenn dies nicht der Fall ist. Bash kann keine NUL-Bytes in Strings verarbeiten. Wenn alsoread
true zurückgegeben wird, wird das NUL-Byte beim Drucken manuell hinzugefügt. Wenn false zurückgegeben wird, wissen wir, dass keine NUL-Bytes mehr vorhanden sind. Dies sollte das letzte Datenelement sein .Getestet mit Bash 4.4 für Dateien mit NULs in der Mitte und endend mit null, einer oder zwei NULs sowie mit den Binärdateien
wget
undcurl
von Debian. Daswget
Herunterladen der 373-kB- Binärdatei dauerte etwa 5,7 Sekunden. Eine Geschwindigkeit von ca. 65 kB / s oder etwas mehr als 512 kB / s.Im Vergleich dazu ist die cat-solution von @ 131 in weniger als 0,1 s oder fast hundertmal schneller fertig. Eigentlich nicht sehr überraschend.
Das ist natürlich albern, da wir ohne externe Dienstprogramme nicht viel mit der heruntergeladenen Datei anfangen können, nicht einmal, um sie ausführbar zu machen.
quelle
echo
undprintf
als Builtins (es braucht ein Builtinprintf
zu implementierenprintf -v
)Wenn Sie dieses Paket libwww-perl haben
Sie können einfach verwenden:
quelle
lynx
Lösung, da Perl mit größerer Wahrscheinlichkeit vorinstalliert ist als Lynx.Verwenden Sie stattdessen das Hochladen über SSH von Ihrem lokalen Computer
Eine "minimal headless * nix" Box bedeutet, dass Sie wahrscheinlich SSH drin haben. Sie können SSH also auch zum Hochladen verwenden . Dies entspricht in der Funktion dem Herunterladen (von Softwarepaketen usw.), es sei denn, Sie möchten, dass ein Download-Befehl in ein Skript auf Ihrem Headless-Server eingefügt wird.
Wie in dieser Antwort gezeigt , würden Sie Folgendes auf Ihrem lokalen Computer ausführen , um eine Datei auf Ihrem Remote-Headless-Server abzulegen:
Schnelleres Hochladen über SSH von einem dritten Computer
Der Nachteil der oben genannten Lösung gegenüber dem Herunterladen ist die geringere Übertragungsgeschwindigkeit, da die Verbindung mit Ihrem lokalen Computer in der Regel eine viel geringere Bandbreite aufweist als die Verbindung zwischen Ihrem Headless-Server und anderen Servern.
Um dies zu beheben, können Sie den obigen Befehl natürlich auf einem anderen Server mit angemessener Bandbreite ausführen. Um dies zu vereinfachen (Vermeidung einer manuellen Anmeldung auf dem dritten Computer), finden Sie hier einen Befehl, den Sie auf Ihrem lokalen Computer ausführen müssen .
Um sicher zu gehen, kopieren Sie diesen Befehl mit dem führenden Leerzeichen und fügen ihn ein
' '
. Siehe die folgenden Erklärungen für den Grund.Erklärungen:
Der Befehl sendet ssh an Ihren dritten Computer
intermediate-host
, lädt dort über eine Datei herunterwget
und lädt sietarget-host
über SSH hoch. Das Herunterladen und Hochladen nutzt die Bandbreite vonintermediate-host
und erfolgt gleichzeitig (aufgrund von Bash-Pipe-Entsprechungen), sodass die Fortschritte schnell sind.In diesem Fall müssen Sie die beiden Serveranmeldungen (
user@*-host
), das Zielhostkennwort (yourpassword
), die Download-URL (http://example.com/…
) und den Ausgabepfad auf Ihrem Zielhost (/path/to/output-file.zip
) durch entsprechende eigene Werte ersetzen .Informationen zu den
-T -e none
SSH-Optionen beim Übertragen von Dateien finden Sie in diesen ausführlichen Erläuterungen .Dieser Befehl ist für Fälle gedacht, in denen Sie den Authentifizierungsmechanismus für öffentliche Schlüssel von SSH nicht verwenden können. Dies ist bei einigen gemeinsam genutzten Hosting-Anbietern, insbesondere Host Europe, immer noch der Fall . Um den Prozess dennoch zu automatisieren, müssen wir
sshpass
das Kennwort im Befehl angeben können. Es musssshpass
auf Ihrem Zwischenhost (sudo apt-get install sshpass
unter Ubuntu) installiert sein .Wir versuchen,
sshpass
auf sichere Weise zu verwenden, aber es wird immer noch nicht so sicher sein wie der SSH-Pubkey-Mechanismus (sagtman sshpass
). Insbesondere geben wir das SSH-Kennwort nicht als Befehlszeilenargument, sondern über eine Datei an, die durch die Ersetzung des Bash-Prozesses ersetzt wird, um sicherzustellen, dass es niemals auf der Festplatte vorhanden ist. Dasprintf
ist eine eingebaute Bash, die sicherstellt, dass dieser Teil des Codes nicht als separater Befehl in derps
Ausgabe erscheint, da dies das Passwort [ source ] enthüllen würde . Ich denke, dass diese Verwendung vonsshpass
genauso sicher ist wie die insshpass -d<file-descriptor>
empfohlene Varianteman sshpass
, da bash sie/dev/fd/*
sowieso intern einem solchen Dateideskriptor zuordnet. Und das ohne Verwendung einer temporären Datei [ Quelle]. Aber keine Garantie, vielleicht habe ich etwas übersehen.Um die
sshpass
Verwendung sicherer zu machen , müssen wir verhindern, dass der Befehl im Bash-Verlauf auf Ihrem lokalen Computer aufgezeichnet wird. Dafür wird dem gesamten Befehl ein Leerzeichen vorangestellt, was diesen Effekt hat.Das
-o StrictHostKeyChecking=no
Teil verhindert, dass der Befehl fehlschlägt, falls keine Verbindung zum Zielhost hergestellt wird. (Normalerweise wartet SSH dann auf Benutzereingaben, um den Verbindungsversuch zu bestätigen. Wir veranlassen es trotzdem.)sshpass
erwartet einenssh
oderscp
Befehl als letztes Argument. Wir müssen also den typischenwget -O - … | ssh …
Befehl in ein Formular ohne Bash-Pipe umschreiben , wie hier erläutert .quelle
Basierend auf @ Chris Snow Rezept. Ich habe einige Verbesserungen vorgenommen:
Hier ist Code:
quelle
echo -en "GET ${PATH} HTTP/1.1\r\nHost: ${HOST}\r\n${tag}\r\n\r\n" >&3
,${tag}
ist nicht angegeben.tag
richtigen Variableneinstellung, es funktioniert nun gut.