Thực thi tập lệnh bash từ URL


184

Giả sử tôi có một tệp tại URL "http://mywebsite.com/myscript.txt" có chứa tập lệnh:

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

Và tôi muốn chạy tập lệnh này mà không lưu tập tin vào tập tin trước. Làm thế nào để tôi làm điều này?

Bây giờ, tôi đã thấy cú pháp:

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

Nhưng điều này dường như không hoạt động như nếu tôi lưu vào một tệp và sau đó thực thi. Ví dụ, đường đọc không hoạt động và đầu ra chỉ là:

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

Tương tự, tôi đã thử:

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

Với kết quả tương tự.

Ban đầu tôi có một giải pháp như:

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

Nhưng điều này có vẻ cẩu thả, và tôi muốn một giải pháp thanh lịch hơn.

Tôi nhận thức được các vấn đề bảo mật liên quan đến việc chạy tập lệnh shell từ URL, nhưng bây giờ hãy bỏ qua tất cả những điều đó.


3
Nếu cuối cùng bạn tạo một tệp tạm thời, có lẽ bạn nên sử dụng mktempthay vì tung ra giải pháp của riêng mình
Hasturkun

cmd <<foo là cú pháp heredoc trong hầu hết các shell và có thể không phải là những gì bạn muốn.
dietbuddha

Câu trả lời:


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

phải làm điều đó Thay phiên, bỏ đi chuyển hướng ban đầu trên của bạn, đó là chuyển hướng đầu vào tiêu chuẩn; bashlấy một tên tệp để thực hiện tốt mà không cần chuyển hướng và <(command)cú pháp cung cấp một đường dẫn.

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

Nó có thể rõ ràng hơn nếu bạn nhìn vào đầu ra của echo <(cat /dev/null)


Cảm ơn, điều này làm cho nó rõ ràng những gì đang xảy ra. Chỉ tò mò, lợi thế của việc sử dụng chuyển hướng ban đầu là gì? Tôi hỏi vì để cài đặt RVM, họ sử dụng lệnh: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Tại sao không chỉ: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan

4
Lưu ý nhỏ: nếu wget có sẵn nhưng curl không (ví dụ như trên thị trường chứng hệ thống máy tính để bàn Ubuntu), bạn có thể thay thế wget -q http://mywebsite.com/myscript.txt -O -cho curl -s http://mywebsite.com/myscript.txt).
D Coetzee

5
Xin lưu ý rằng bạn không thể truyền đối số dòng lệnh vào tập lệnh của mình. bash will_not_work foobar <(curl -s http://example.com/myscript.sh)Nếu bạn sở hữu tập lệnh, bạn có thể sử dụng các biến môi trường thay vì như vậy: MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)và nó cũng hoạt động với các đường ống như vậy: curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bashTất nhiên điều này yêu cầu bạn sử dụng MYFLAG1 và MYFLAG2 thay vì $ 1 và $ 2
Bruno Bronosky 18/03/13

3
$ sudo bash <(curl -s xxx ) đã gặp lỗi: bash: / dev / fd / 63: Mô tả tệp xấu
Jake

2
Giải pháp đầu tiên (giải pháp sử dụng nguồn) hoàn toàn không hoạt động. Thứ hai làm việc phần nào nhưng có những hạn chế của nó. Nó đang thực thi tập lệnh từ URL trong một khung con. Tôi có một số chức năng được xác định trong tập lệnh mà tôi muốn sử dụng trong phần cha mẹ. Có cách nào để đạt được điều đó? Hoặc tôi không gặp may và giải pháp duy nhất là sao chép tập lệnh đó trong một tệp tạm thời và sau đó lấy nguồn?
Harsh Pandey

86

Đây là cách để thực thi tập lệnh từ xa với việc truyền cho nó một số đối số (arg1 arg2):

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

2
Điều này phá vỡ stty: \ sử dụng bash <(curl ... ) nếu bạn sử dụng stdin
Flores Robles

47

Đối với bash, vỏ Bourne và cá:

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

Cờ "-s" làm cho vỏ đọc từ stdin.


1
điều này sẽ hoạt động trong hầu hết các vỏ, trong khi câu trả lời được chấp nhận không hoạt động với , ví dụ.
hoijui

16

Sử dụng wget, thường là một phần của cài đặt hệ thống mặc định:

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

RTFM: gnu.org/software/wget/manual/wget.html . | | -q == --quiet == "Tắt đầu ra của Wget." | | -O- == --output-document = - == Nếu '-' được sử dụng làm tệp, tài liệu sẽ được in ra đầu ra tiêu chuẩn.
amra

13

Sử dụng:

curl -s -L URL_TO_SCRIPT_HERE | bash

Ví dụ:

curl -s -L http://bitly/10hA8iC | bash


11

Bạn cũng có thể làm điều này:

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

11

Cách tốt nhất để làm điều đó là

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

đó là một thay đổi nhỏ của câu trả lời bởi @ user77115


6

Tôi thường sử dụng như sau là đủ

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

Nhưng trong một hệ thống cũ (kernel2.4), nó gặp phải vấn đề và làm những điều sau đây có thể giải quyết nó, tôi đã thử nhiều cách khác, chỉ những công việc sau

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

Ví dụ

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

Sự cố có thể do mạng chậm hoặc phiên bản bash quá cũ không thể xử lý mạng chậm một cách duyên dáng

Tuy nhiên, sau đây giải quyết vấn đề

$ 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

Cũng thế:

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

3
Liều cuối cùng có nghĩa là gì?
kéo xe

Từ trang bash man: A - báo hiệu kết thúc các tùy chọn và vô hiệu hóa xử lý tùy chọn tiếp theo. Bất kỳ đối số nào sau - được coi là tên tệp và đối số. Một đối số của - tương đương với -.
Giang Shi

3

Chỉ cần kết hợp câu trả lời của amra và user77115:

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

Nó thực thi tập lệnh xa bbstart.sh truyền cho nó các tùy chọn -v -v.


2

Là một số tập lệnh không giám sát, tôi sử dụng lệnh sau:

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

Tôi khuyên bạn nên tránh thực thi các tập lệnh trực tiếp từ URL. Bạn nên chắc chắn rằng URL an toàn và kiểm tra nội dung của tập lệnh trước khi thực thi, bạn có thể sử dụng tổng kiểm tra SHA256 để xác thực tệp trước khi thực hiện.


0

Cách này là tốt và thông thường:

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

ví dụ thực tế:

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


Oh, wow im alive


juan@juan-MS-7808:~$ 

Điều này là thẳng lên sai. Kiểm tra tập lệnh của bạn trước khi đăng và không đầu ra giả.
korkman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.