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.


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)


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

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.


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)

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

12

Versuchen Sie einfach:

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

11

Sie können dies auch tun:

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

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


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
$

4

Ebenfalls:

curl -sL https://.... | sudo bash -

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.


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.


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: $#

-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:~$ 

Das ist geradezu falsch. Testen Sie Ihre Skripte vor dem Posten und fälschen Sie keine Ausgabe.
Korkman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.