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.
mktemp
anstatt Ihre eigene Lösung zucmd <<foo
ist Heredoc-Syntax in den meisten Shells und wahrscheinlich nicht das, was Sie wollen.Antworten:
sollte es tun. Lassen Sie alternativ die anfängliche Umleitung bei Ihnen weg, bei der die Standardeingabe umgeleitet wird.
bash
Nimmt einen Dateinamen, um ohne Umleitung einwandfrei ausgeführt zu werden, und die<(command)
Syntax liefert einen Pfad.Es kann klarer sein, wenn Sie die Ausgabe von betrachten
echo <(cat /dev/null)
quelle
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
Warum nicht einfach:bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
wget -q http://mywebsite.com/myscript.txt -O -
fürcurl -s http://mywebsite.com/myscript.txt
).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 wiecurl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bash
folgt : Dies erfordert natürlich, dass Sie MYFLAG1 und MYFLAG2 anstelle von $ 1 und $ 2 verwendenAuf diese Weise können Sie ein Remote-Skript ausführen, indem Sie einige Argumente an dieses übergeben (arg1 arg2):
quelle
bash <(curl ... )
wenn Sie stdinFür Bash, Bourne Muschel und Fisch:
Mit dem Flag "-s" wird die Shell von stdin gelesen.
quelle
Verwenden
wget
, was normalerweise Teil der Standardsysteminstallation ist:quelle
Verwenden:
Beispielsweise:
quelle
Versuchen Sie einfach:
quelle
Sie können dies auch tun:
quelle
Der beste Weg, es zu tun, ist
Dies ist eine geringfügige Änderung der Antwort von @ user77115
quelle
Ich benutze oft das Folgende ist genug
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
Beispiele
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
quelle
Ebenfalls:
quelle
Kombinieren Sie einfach die Antworten von amra und user77115:
Es führt das entfernte Skript bbstart.sh aus und übergibt ihm die Optionen -v -v.
quelle
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.
quelle
Dieser Weg ist gut und konventionell:
quelle
aktuelles Beispiel:
quelle