Führen Sie das Bash-Skript über die URL aus

182

Angenommen, ich habe eine Datei unter der URL "http://mywebsite.com/myscript.txt", die ein Skript enthält:

#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"

Und ich möchte dieses Skript ausführen, ohne es zuvor in einer Datei zu speichern. Wie mache ich das?

Jetzt habe ich die Syntax gesehen:

bash < <(curl -s http://mywebsite.com/myscript.txt)

Dies scheint jedoch nicht so zu funktionieren, als würde ich es in einer Datei speichern und dann ausführen. Zum Beispiel funktioniert readline nicht und die Ausgabe ist nur:

$ bash < <(curl -s http://mywebsite.com/myscript.txt)
Hello, world!

Ebenso habe ich versucht:

curl -s http://mywebsite.com/myscript.txt | bash -s --

Mit den gleichen Ergebnissen.

Ursprünglich hatte ich eine Lösung wie:

timestamp=`date +%Y%m%d%H%M%S`
curl -s http://mywebsite.com/myscript.txt -o /tmp/.myscript.${timestamp}.tmp
bash /tmp/.myscript.${timestamp}.tmp
rm -f /tmp/.myscript.${timestamp}.tmp

Aber das scheint schlampig, und ich hätte gerne eine elegantere Lösung.

Ich bin mir der Sicherheitsprobleme beim Ausführen eines Shell-Skripts über eine URL bewusst, aber lassen Sie uns dies alles vorerst ignorieren.

Tristan
quelle
3
Wenn Sie am Ende eine temporäre Datei erstellen, sollten Sie wahrscheinlich verwenden, mktempanstatt Ihre eigene Lösung zu
rollen
cmd <<foo ist Heredoc-Syntax in den meisten Shells und wahrscheinlich nicht das, was Sie wollen.
Dietbuddha

Antworten:

217
source <(curl -s http://mywebsite.com/myscript.txt)

sollte es tun. Lassen Sie alternativ die anfängliche Umleitung bei Ihnen weg, bei der die Standardeingabe umgeleitet wird. bashNimmt einen Dateinamen, um ohne Umleitung einwandfrei ausgeführt zu werden, und die <(command)Syntax liefert einen Pfad.

bash <(curl -s http://mywebsite.com/myscript.txt)

Es kann klarer sein, wenn Sie die Ausgabe von betrachten echo <(cat /dev/null)

Geekosaurier
quelle
Danke, das machte deutlich, was los war. Nur neugierig, was ist der Vorteil dieser anfänglichen Umleitung? Ich frage, weil für die RVM-Installation sie den Befehl verwenden: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Warum nicht einfach: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan
4
Kleine Anmerkung: wenn wget vorhanden ist , aber Locke ist nicht (zB auf einem Lager Ubuntu Desktop - System) können Sie ersetzen wget -q http://mywebsite.com/myscript.txt -O -für curl -s http://mywebsite.com/myscript.txt).
D Coetzee
5
Beachten Sie, dass Sie keine Befehlszeilenargumente an Ihr Skript übergeben können. bash will_not_work foobar <(curl -s http://example.com/myscript.sh)Wenn Sie das Skript besitzen, können Sie stattdessen Umgebungsvariablen wie folgt verwenden : MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)und es funktioniert auch mit Pipes wie curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bashfolgt : Dies erfordert natürlich, dass Sie MYFLAG1 und MYFLAG2 anstelle von $ 1 und $ 2 verwenden
Bruno Bronosky
3
$ sudo bash <(curl -s xxx ) hat Fehler erhalten: bash: / dev / fd / 63: Fehlerhafter Dateideskriptor
Jake
2
Die erste Lösung (die mit Quelle) funktionierte überhaupt nicht. Der zweite hat etwas funktioniert, hat aber seine Grenzen. Das Skript wird über die URL in einer Subshell ausgeführt. Ich habe einige Funktionen im Skript definiert, die ich im übergeordneten Element verwenden möchte. Gibt es überhaupt etwas zu erreichen? Oder habe ich kein Glück und die einzige Lösung besteht darin, das Skript in eine temporäre Datei zu kopieren und es dann zu beschaffen?
Harsh Pandey
86

Auf diese Weise können Sie ein Remote-Skript ausführen, indem Sie einige Argumente an dieses übergeben (arg1 arg2):

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2
Anandi Das
quelle
2
Dies bricht stty: \ verwenden, bash <(curl ... ) wenn Sie stdin
Flores Robles
47

Für Bash, Bourne Muschel und Fisch:

curl -s http://server/path/script.sh | bash -s arg1 arg2

Mit dem Flag "-s" wird die Shell von stdin gelesen.

user77115
quelle
1
Dies sollte in den meisten Muscheln funktionieren, während die akzeptierte Antwort beispielsweise bei Fischen nicht funktioniert .
Hoijui
16

Verwenden wget, was normalerweise Teil der Standardsysteminstallation ist:

bash <(wget -qO- http://mywebsite.com/myscript.txt)
amra
quelle
RTFM: gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Schaltet die Ausgabe von Wget aus." ||| -O- == --output-document = - == Wenn '-' als Datei verwendet wird, werden Dokumente in der Standardausgabe gedruckt.
Amra
13

Verwenden:

curl -s -L URL_TO_SCRIPT_HERE | bash

Beispielsweise:

curl -s -L http://bitly/10hA8iC | bash
Katie MC
quelle
12

Versuchen Sie einfach:

bash <(curl -s http://mywebsite.com/myscript.txt)
Random832
quelle
11

Sie können dies auch tun:

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash
luismartingil
quelle
11

Der beste Weg, es zu tun, ist

curl http://domain/path/to/script.sh | bash -s arg1 arg2

Dies ist eine geringfügige Änderung der Antwort von @ user77115

Vamsidhar Muggulla
quelle
6

Ich benutze oft das Folgende ist genug

curl -s http://mywebsite.com/myscript.txt | sh

Aber in einem alten System (Kernel2.4) stößt es auf Probleme, und das Folgende kann es lösen, ich habe viele andere ausprobiert, nur das Folgende funktioniert

curl -s http://mywebsite.com/myscript.txt -o a.sh && sh a.sh && rm -f a.sh

Beispiele

$ curl -s someurl | sh
Starting to insert crontab
sh: _name}.sh: command not found
sh: line 208: syntax error near unexpected token `then'
sh: line 208: ` -eq 0 ]]; then'
$

Das Problem kann durch eine langsame Netzwerkversion oder eine zu alte Bash-Version verursacht werden, die die langsame Netzwerkumgebung nicht ordnungsgemäß handhaben kann

Das Folgende löst jedoch das Problem

$ curl -s someurl -o a.sh && sh a.sh && rm -f a.sh
Starting to insert crontab
Insert crontab entry is ok.
Insert crontab is done.
okay
$
Chinglin Wen
quelle
4

Ebenfalls:

curl -sL https://.... | sudo bash -
Thomas Decaux
quelle
3
Welche Dosis bedeutet der letzte Streifen?
Towry
Auf der Bash-Manpage: A - signalisiert das Ende von Optionen und deaktiviert die weitere Optionsverarbeitung. Alle Argumente nach dem - werden als Dateinamen und Argumente behandelt. Ein Argument von - ist gleichbedeutend mit -.
Mingjiang Shi
3

Kombinieren Sie einfach die Antworten von amra und user77115:

wget -qO- https://raw.githubusercontent.com/lingtalfi/TheScientist/master/_bb_autoload/bbstart.sh | bash -s -- -v -v

Es führt das entfernte Skript bbstart.sh aus und übergibt ihm die Optionen -v -v.

ling
quelle
2

Bei einigen unbeaufsichtigten Skripten verwende ich den folgenden Befehl:

sh -c "$(curl -fsSL <URL>)"

Ich empfehle, die Ausführung von Skripten direkt über URLs zu vermeiden. Sie sollten sicher sein, dass die URL sicher ist, und den Inhalt des Skripts vor der Ausführung überprüfen. Sie können eine SHA256-Prüfsumme verwenden, um die Datei vor der Ausführung zu validieren.

Mauricio Sánchez
quelle
0

Dieser Weg ist gut und konventionell:

17:04:59@itqx|~
qx>source <(curl -Ls http://192.168.80.154/cent74/just4Test) Lord Jesus Loves YOU
Remote script test...
Param size: 4

---------
17:19:31@node7|/var/www/html/cent74
arch>cat just4Test
echo Remote script test...
echo Param size: $#
Javafoot
quelle
-3
bash | curl http://your.url.here/script.txt

aktuelles Beispiel:

juan@juan-MS-7808:~$ bash | curl https://raw.githubusercontent.com/JPHACKER2k18/markwe/master/testapp.sh


Oh, wow im alive


juan@juan-MS-7808:~$ 
Zufällige Meme 2k18
quelle
Das ist geradezu falsch. Testen Sie Ihre Skripte vor dem Posten und fälschen Sie keine Ausgabe.
Korkman