ดำเนินการสคริปต์ทุบตีจาก URL


184

บอกว่าฉันมีไฟล์ที่ URL "http://mywebsite.com/myscript.txt" ที่มีสคริปต์:

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

และฉันต้องการเรียกใช้สคริปต์นี้โดยไม่บันทึกเป็นไฟล์ก่อน ฉันจะทำสิ่งนี้ได้อย่างไร

ตอนนี้ฉันได้เห็นไวยากรณ์:

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

แต่ดูเหมือนว่ามันจะไม่ทำงานถ้าหากฉันบันทึกลงไฟล์แล้วก็ดำเนินการ เช่น readline ไม่ทำงานและผลลัพธ์เป็นเพียง:

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

ฉันได้ลอง:

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

ด้วยผลลัพธ์เดียวกัน

เดิมทีฉันมีวิธีแก้ปัญหาเช่น:

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

แต่ดูเหมือนจะเลอะเทอะและฉันต้องการทางออกที่หรูหรากว่า

ฉันรับทราบถึงปัญหาด้านความปลอดภัยเกี่ยวกับการเรียกใช้เชลล์สคริปต์จาก URL แต่เราไม่ต้องสนใจเรื่องทั้งหมดในตอนนี้


3
หากคุณสร้างไฟล์ชั่วคราวคุณควรจะใช้mktempแทนการใช้โซลูชันของคุณเอง
Hasturkun

cmd <<foo เป็นไวยากรณ์ heredoc ในเชลล์ส่วนใหญ่และอาจไม่ใช่สิ่งที่คุณต้องการ
dietbuddha

คำตอบ:


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

ควรจะทำมัน อีกทางหนึ่งคือปิดการเปลี่ยนเส้นทางเริ่มต้นของคุณซึ่งเปลี่ยนเส้นทางอินพุตมาตรฐาน bashใช้ชื่อไฟล์ที่จะดำเนินการได้ดีโดยไม่มีการเปลี่ยนเส้นทางและ<(command)ไวยากรณ์ให้เส้นทาง

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

มันอาจจะชัดเจนถ้าคุณดูผลลัพธ์ของ echo <(cat /dev/null)


ขอบคุณสิ่งนี้ทำให้ชัดเจนว่าเกิดอะไรขึ้น แค่อยากรู้อยากเห็นข้อดีของการใช้การเปลี่ยนเส้นทางครั้งแรกนั้นคืออะไร? ผมถามเพราะสำหรับการติดตั้ง RVM พวกเขาใช้คำสั่ง: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) ทำไมไม่เพียง: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
อุโมงค์

4
บันทึกขนาดเล็ก: ถ้า wget สามารถใช้ได้ แต่ขดไม่ได้ (เช่นในหุ้นระบบคอมพิวเตอร์ Ubuntu) คุณสามารถใช้แทนwget -q http://mywebsite.com/myscript.txt -O -สำหรับcurl -s http://mywebsite.com/myscript.txt)
D Coetzee

5
โปรดระวังว่าคุณไม่สามารถส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งไปยังสคริปต์ของคุณได้ bash will_not_work foobar <(curl -s http://example.com/myscript.sh)หากคุณเป็นเจ้าของสคริปต์คุณสามารถใช้ตัวแปรสภาพแวดล้อมแทนได้เช่นกัน: MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)และยังทำงานกับcurl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bashไพพ์เช่น: แน่นอนว่าคุณต้องใช้ MYFLAG1 และ MYFLAG2 แทน $ 1 และ $ 2
Bruno Bronosky

3
$ sudo bash <(curl -s xxx ) มีข้อผิดพลาด: bash: / dev / fd / 63: ตัวอธิบายไฟล์ไม่ถูกต้อง
Jake

2
วิธีแก้ปัญหาแรก (ที่ใช้แหล่งที่มา) ไม่ทำงานเลย ที่สองทำงานค่อนข้าง แต่มีข้อ จำกัด มันกำลังรันสคริปต์จาก URL ใน subshell ฉันมีฟังก์ชั่นบางอย่างที่กำหนดไว้ในสคริปต์ที่ฉันต้องการใช้ในแม่ อย่างไรก็ตามมีเพื่อให้บรรลุว่า หรือฉันโชคไม่ดีและทางออกเดียวคือการคัดลอกสคริปต์นั้นไปยังไฟล์ชั่วคราวแล้วส่งมา?
Harsh Pandey

86

นี่เป็นวิธีเรียกใช้สคริปต์ระยะไกลโดยส่งผ่านอาร์กิวเมนต์บางตัว (arg1 arg2):

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

2
นี่เป็นการแบ่ง stty: \ use bash <(curl ... ) ถ้าคุณใช้ stdin
Flores Robles

47

สำหรับ bash, Bourne shell และปลา:

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

ตั้งค่าสถานะ "-s" ทำให้เชลล์อ่านจาก stdin


1
สิ่งนี้น่าจะใช้ได้กับหอยส่วนใหญ่ในขณะที่คำตอบที่ยอมรับไม่ได้กับปลาตัวอย่างเช่น
hoijui

16

การใช้wgetซึ่งโดยปกติจะเป็นส่วนหนึ่งของการติดตั้งระบบเริ่มต้น:

bash <(wget -qO- http://mywebsite.com/myscript.txt)

RTFM: gnu.org/software/wget/manual/wget.html ||| -q == --quiet == "ปิดเอาต์พุตของ Wget" ||| -O- == --output-document = - == หากใช้ '-' เป็นไฟล์เอกสารจะถูกพิมพ์ไปยังเอาต์พุตมาตรฐาน
amra




11

วิธีที่ดีที่สุดที่จะทำคือ

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

ซึ่งเป็นการเปลี่ยนแปลงเล็กน้อยของคำตอบโดย @ user77115


6

ฉันมักจะใช้สิ่งต่อไปนี้ก็เพียงพอแล้ว

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

แต่ในระบบเก่า (kernel2.4) มันประสบปัญหาและทำสิ่งต่อไปนี้สามารถแก้ไขได้ฉันลองใช้อื่น ๆ อีกมากมายเฉพาะงานต่อไปนี้

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

ตัวอย่าง

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

ปัญหาอาจเกิดจากเครือข่ายช้าหรือรุ่นทุบตีเก่าเกินไปที่ไม่สามารถจัดการเครือข่ายช้าอย่างสง่างาม

อย่างไรก็ตามข้อมูลต่อไปนี้สามารถแก้ไขปัญหาได้

$ 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

นอกจากนี้:

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

3
แถบสุดท้ายหมายความว่าอย่างไร
58

จากหน้า bash man: A - ส่งสัญญาณการสิ้นสุดของตัวเลือกและปิดการใช้งานการประมวลผลตัวเลือกเพิ่มเติม ข้อโต้แย้งใด ๆ หลังจาก - จะถือว่าเป็นชื่อไฟล์และข้อโต้แย้ง อาร์กิวเมนต์ของ - เทียบเท่ากับ -
Mingjiang Shi

3

เพียงแค่รวมคำตอบของ amra และ user77115:

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

มันรันสคริปต์ bbstart.sh ทางไกลผ่านตัวเลือก -v -v


2

มีสคริปต์ที่ไม่ต้องใส่ข้อมูลหรือไม่ฉันใช้คำสั่งต่อไปนี้:

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

ฉันแนะนำให้หลีกเลี่ยงการเรียกใช้งานสคริปต์โดยตรงจาก URL คุณควรแน่ใจว่า URL นั้นปลอดภัยและตรวจสอบเนื้อหาของสคริปต์ก่อนดำเนินการคุณสามารถใช้การตรวจสอบ SHA256 เพื่อตรวจสอบความถูกต้องของไฟล์ก่อนดำเนินการ


0

วิธีนี้ดีและธรรมดา:

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

ตัวอย่างจริง:

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


Oh, wow im alive


juan@juan-MS-7808:~$ 

ตรงนี้ผิด ทดสอบสคริปต์ของคุณก่อนโพสต์และไม่ส่งออกปลอม
korkman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.