Jalankan skrip bash dari URL

184

Katakanlah saya punya file di URL "http://mywebsite.com/myscript.txt" yang berisi skrip:

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

Dan saya ingin menjalankan skrip ini tanpa terlebih dahulu menyimpannya ke file. Bagaimana saya melakukan ini?

Sekarang, saya telah melihat sintaksnya:

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

Tapi ini sepertinya tidak berfungsi seperti jika saya menyimpan ke file dan kemudian dieksekusi. Misalnya readline tidak berfungsi, dan outputnya hanya:

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

Demikian pula, saya sudah mencoba:

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

Dengan hasil yang sama.

Awalnya saya punya solusi seperti:

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

Tapi ini sepertinya ceroboh, dan saya ingin solusi yang lebih elegan.

Saya mengetahui masalah keamanan terkait menjalankan skrip shell dari URL, tetapi mari kita abaikan semua itu untuk saat ini.

Tristan
sumber
3
Jika Anda akhirnya membuat file sementara, Anda mungkin harus menggunakan mktempalih-alih menggulirkan solusi Anda sendiri
Hasturkun
cmd <<foo adalah sintaks heredoc di sebagian besar shell dan mungkin bukan yang Anda inginkan.
dietbuddha

Jawaban:

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

seharusnya melakukannya. Bergantian, tinggalkan pengalihan awal pada Anda, yang mengarahkan input standar; bashmengambil nama file untuk mengeksekusi dengan baik tanpa pengalihan, dan <(command)sintaks menyediakan path.

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

Mungkin lebih jelas jika Anda melihat output dari echo <(cat /dev/null)

geekosaurus
sumber
Terima kasih, ini memperjelas apa yang sedang terjadi. Hanya ingin tahu, apa keuntungan menggunakan pengalihan awal itu? Saya bertanya karena untuk instalasi RVM, mereka menggunakan perintah: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Mengapa tidak hanya: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan
4
Catatan kecil: jika wget tersedia tetapi curl adalah tidak (misalnya pada saham sistem desktop Ubuntu), Anda dapat menggantikan wget -q http://mywebsite.com/myscript.txt -O -untuk curl -s http://mywebsite.com/myscript.txt).
D Coetzee
5
Ketahuilah bahwa Anda tidak dapat meneruskan argumen baris perintah ke skrip Anda. bash will_not_work foobar <(curl -s http://example.com/myscript.sh)Jika Anda memiliki skrip, Anda dapat menggunakan variabel lingkungan sebagai gantinya: MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)dan itu juga berfungsi dengan pipa seperti: curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bashIni tentu saja mengharuskan Anda menggunakan MYFLAG1 dan MYFLAG2 alih-alih $ 1 dan $ 2
Bruno Bronosky
3
$ sudo bash <(curl -s xxx ) mendapat kesalahan: bash: / dev / fd / 63: deskriptor file buruk
Jake
2
Solusi pertama (yang menggunakan sumber) tidak berfungsi sama sekali. Yang kedua bekerja agak tetapi memiliki keterbatasan. Itu mengeksekusi skrip dari URL dalam sebuah subkulit. Saya memiliki beberapa fungsi yang didefinisikan dalam skrip yang ingin saya gunakan di induknya. Apakah ada cara untuk mencapai itu? Atau apakah saya kurang beruntung dan satu-satunya solusi adalah menyalin skrip itu dalam file sementara dan kemudian sumbernya?
Harsh Pandey
86

Ini adalah cara untuk mengeksekusi skrip jarak jauh dengan memberikan beberapa argumen (arg1 arg2):

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2
Anandi Das
sumber
2
this break stty: \ use bash <(curl ... ) jika Anda menggunakan stdin
Flores Robles
47

Untuk bash, kulit Bourne dan ikan:

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

Bendera "-s" membuat shell dibaca dari stdin.

pengguna77115
sumber
1
ini seharusnya bekerja di sebagian besar cangkang, sementara jawaban yang diterima tidak bekerja dengan ikan , misalnya.
hoijui
16

Menggunakan wget, yang biasanya merupakan bagian dari instalasi sistem default:

bash <(wget -qO- http://mywebsite.com/myscript.txt)
amra
sumber
RTFM: gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Matikan output Wget." ||| -O- == --output-document = - == Jika '-' digunakan sebagai file, dokumen akan dicetak ke output standar.
amra
13

Menggunakan:

curl -s -L URL_TO_SCRIPT_HERE | bash

Sebagai contoh:

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

Coba saja:

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

Anda juga dapat melakukan ini:

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

Cara terbaik untuk melakukannya adalah

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

yang merupakan sedikit perubahan jawaban oleh @ user77115

Vamsidhar Muggulla
sumber
6

Saya sering menggunakan yang berikut ini sudah cukup

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

Tetapi dalam sistem lama (kernel2.4), ia menemui masalah, dan melakukan hal berikut dapat menyelesaikannya, saya mencoba banyak yang lain, hanya karya-karya berikut

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

Contohnya

$ 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'
$

Masalahnya mungkin disebabkan oleh lambatnya jaringan, atau versi bash terlalu lama yang tidak bisa menangani lambatnya jaringan dengan anggun

Namun, berikut ini menyelesaikan masalah

$ 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
sumber
4

Juga:

curl -sL https://.... | sudo bash -
Thomas Decaux
sumber
3
Apa dosis strip terakhir artinya?
towry
Dari halaman manual bash: A - memberi sinyal akhir opsi dan menonaktifkan pemrosesan opsi lebih lanjut. Setiap argumen setelah - diperlakukan sebagai nama file dan argumen. Argumen - setara dengan -.
Mingjiang Shi
3

Hanya menggabungkan jawaban amra dan user77115:

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

Ini mengeksekusi skrip jauh bbstart.sh meneruskannya opsi -v -v.

ling
sumber
2

Apakah beberapa skrip yang tidak dijaga saya menggunakan perintah berikut:

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

Saya merekomendasikan untuk menghindari mengeksekusi skrip langsung dari URL. Anda harus yakin URL itu aman dan memeriksa konten skrip sebelum mengeksekusi, Anda dapat menggunakan SHA256 checksum untuk memvalidasi file sebelum mengeksekusi.

Mauricio Sánchez
sumber
0

Cara ini baik dan konvensional:

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
sumber
-3
bash | curl http://your.url.here/script.txt

contoh aktual:

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


Oh, wow im alive


juan@juan-MS-7808:~$ 
Meme acak 2k18
sumber
Ini salah lurus. Uji skrip Anda sebelum memposting dan jangan memalsukan hasil.
korkman