Wget ein Skript und führen Sie es aus

Antworten:

51

Vorsichtig

Vertrauen Sie der Person, die das Skript geschrieben hat, bevor Sie es ausführen?

Haben Sie beispielsweise erwartet, dass das Skript dies enthält?

echo "brain1" > /etc/hostname

Dadurch wird versucht, Ihren Hostnamen zu ändern.


Zum späteren Nachschlagen können Sie das Skript, nachdem Sie überprüft haben, ob es korrekt und nicht böswillig ist, in einer Zeile wie der folgenden ausführen:

wget -O - http://dl.dropbox.com/u/11210438/flockonus-stack.sh | bash

Laden Sie es jedoch separat herunter und lesen Sie es, bevor Sie es zum ersten Mal ausführen.

Beachten Sie auch, dass interaktive Eingabeaufforderungen im heruntergeladenen Skript mit dieser Methode möglicherweise nicht ordnungsgemäß funktionieren.

Mikel
quelle
9
+1, um auf die (erheblichen) Sicherheitsbedenken hinzuweisen. Seien Sie absolut sicher, dass Sie der Quelle vertrauen. Das echo "brain1" > /etc/hostnamekönnte genauso gut sein rm -rf /.
Christopher Cashell
2
+1 Danke Jungs, dieses Skript ist von mir, es ist sicher. Liebte den Einzeiler, aber es hat einige interaktive Zeilen, die nicht liefen. Keine Ahnung warum?
Fabiano Soriani
1
Deine apt-get installZeilen? Wenn apt-getzusätzliche Abhängigkeiten installiert werden, werden Sie gefragt, und wenn dies nicht möglich ist, wird das Programm aus Sicherheitsgründen beendet. Fügen Sie entweder alle abhängigen Pakete zu den Befehlszeilenargumenten hinzu, oder ziehen Sie in Betracht -y, z. B.apt-get -y install...
Mikel,
Das Problem hat nichts mit Abhängigkeiten zu tun, es hat mit apt flushing stdin zu tun.
Zoredache
1
Man kann der Quelle eigentlich nicht vertrauen, auch wenn man der Quelle "vertraut", weil der Mensch in der Mitte angreift. Allerdings sollten zufällige private URLs mit Bash-Skripten ein Angriffsvektor sein, der so eng ist, dass sich niemand mit der Fähigkeit zum Abziehen dafür interessiert.
SpamapS
9

Nicht interaktive Skripte

wget -O - http://website.com/my-script.sh | bash

Beachten Sie, dass interaktive Skripte bei dieser Methode nicht funktionieren.


Interaktive Skripte

Damit interaktive Skripte funktionieren, können Sie Folgendes verwenden:

bash <(wget -qO- http://website.com/my-script.sh)

Interaktive Skripte, die als root ausgeführt werden müssen

Warnung: Dies ist äußerst gefährlich. Nicht empfohlen.

sudo su -c "bash <(wget -qO- http://website.com/my-script.sh)" root

Beachten Sie, dass Sie nicht einfach verwenden können, sudo bashda mit <(...)eine virtuelle Datei erstellt wird und der Dateideskriptor nicht über die Roots-Bash-Instanz zugänglich ist. Es muss auf demselben Benutzer ausgeführt werden, der die virtuelle Datei lesen muss, und muss daher als eigener Befehl in der Shell des Root-Benutzers gesendet werden.

Nathan F.
quelle
1
Das ist die beste Antwort. Es werden die wichtigen Aspekte der interaktiven oder nicht interaktiven oder privilegierten Ausführung behandelt.
Leonid Makarov
5

Das Drehbuch ist von mir, es ist sicher. Liebte den Einzeiler, aber es hat einige interaktive Zeilen, die nicht liefen. Keine Ahnung warum?

Wenn dpkg ausgeführt wird, das von apt-get aufgerufen wird, wird stdin gelöscht. Wenn Sie einen Befehl wie verwenden curl blah | bash, senden Sie den Inhalt der Seite im Grunde genommen über STDIN an bash. Wenn einer Ihrer Befehle apt-get ist und ausgeführt wird, wird alles andere gelöscht.

Der Trick besteht darin, einen Befehl wie diesen zu verwenden apt-get install --yes denyhosts </dev/null. Dies gibt apt-get eine andere Eingabe und löscht einfach / dev / null anstelle des Restes Ihres Skripts.

Wenn Sie ein vollständiges Beispiel für die Installation über ein Remote-Skript anzeigen möchten, können Sie sich dieses Skript zum Einrichten von Denyhosts ansehen

Für die Aufzeichnung, ich bevorzuge Curl gegenüber Wget, aber Wget sollte auch in Ordnung sein.

Zoredache
quelle
Ich habe versucht, mit einem Dummy-Skript mit einigen interaktiven, es hat funktioniert, Alter .. Ich verstehe es nicht xD dl.dropbox.com/u/11210438/lala.sh
Fabiano Soriani
4
#!/bin/sh
if [ ! -f "/tmp/flockonus-stack.sh" ]
then
    wget -O /tmp/flockonus-stack.sh http://dl.dropbox.com/u/11210438/flockonus-stack.sh
fi

sh /tmp/flockonus-stack.sh
Lynxman
quelle
4

All diesen Beispielen fehlt ein ziemlich wichtiger Punkt. Wenn Sie die URL verwenden http://dl.dropbox.com/u/11210438/flockonus-stack.sh, müssen Sie das Skript bei jedem Download überprüfen, da es von jedem im Netzwerkpfad zwischen Ihnen und Dropbox geändert werden kann. Wenn Sie zu http s : //dl.dropbox.com/u/11210438/flockonus-stack.sh wechseln, haben Sie diese Quelle der Unsicherheit nicht.

(Dropbox versucht, die http-URL zu https umzuleiten, aber im Falle eines Netzwerkangriffs würde wget niemals mit der realen Dropbox sprechen und würde die Umleitung niemals sehen.)

pde
quelle
2
Dies ist wahrscheinlich besser als Kommentar zu der Frage zu belassen, als eine Antwort, da es die Frage nicht genau beantwortet. Immer noch einen Hinweis wert!
Bill Weiss
2

Laden Sie es einfach so herunter, wie Sie es mit wget angegeben haben, und führen Sie es dann direkt aus. Sie können einfallsreiche Variablen für das Skript verwenden, das Sie herunterladen möchten usw., aber dies wird den Trick tun

Beispielsweise:

!#/bin/bash

#Change to temp directory
cd /tmp

#Download file using wget
wget http://dl.dropbox.com/u/11210438/flockonus-stack.sh

#Execute the file

sh flockonus-stack.sh
Brett
quelle
Wie würde ich meinem System sagen, dass es dies beim Start tatsächlich tun soll?
Metallkiller