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)

लेकिन यह ऐसा काम नहीं करता है जैसे अगर मैं किसी फ़ाइल में सहेजता और फिर निष्पादित होता। उदाहरण के लिए रीडलाइन काम नहीं करती है, और आउटपुट सिर्फ:

$ 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अपने स्वयं के समाधान को रोल करने के बजाय उपयोग करना चाहिए
हेस्तुरकुन

cmd <<foo अधिकांश गोले में हेरेडोक सिंटैक्स है और शायद आप जो चाहते हैं वह नहीं है।
आहारबोधा

जवाबों:


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

करना चाहिए था। वैकल्पिक रूप से, प्रारंभिक पुनर्निर्देशन को आप पर छोड़ दें, जो मानक इनपुट को पुनर्निर्देशित कर रहा है; bashपुनर्निर्देशन के बिना बस ठीक निष्पादित करने के लिए एक फ़ाइल नाम लेता है, और <(command)सिंटैक्स एक पथ प्रदान करता है।

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

यदि आप इसका आउटपुट देखते हैं तो यह स्पष्ट हो सकता है echo <(cat /dev/null)


धन्यवाद, यह स्पष्ट कर दिया कि क्या चल रहा था। बस जिज्ञासु, उस प्रारंभिक पुनर्निर्देशन का उपयोग करने का क्या फायदा है? मैं पूछता हूं कि आरवीएम इंस्टॉलेशन के लिए, वे कमांड का उपयोग करते हैं: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) न सिर्फ क्यों: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
ट्रिस्टन

4
छोटे नोट: यदि wget उपलब्ध है, लेकिन कर्ल (जैसे एक शेयर उबंटू डेस्कटॉप सिस्टम पर) नहीं है, आप स्थानापन्न कर सकते हैं 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 और इसके बजाय $ 1 और $ 2 की MYFLAG2 का उपयोग
ब्रूनो Bronosky

3
$ sudo bash <(curl -s xxx ) को त्रुटि मिली: bash: / dev / fd / 63: खराब फ़ाइल विवरणक
Jake

2
पहला समाधान (स्रोत का उपयोग करने वाला) बिल्कुल काम नहीं करता था। दूसरे ने कुछ हद तक काम किया लेकिन उसकी सीमाएँ हैं। यह URL से स्क्रिप्ट को सबशेल में निष्पादित कर रहा है। मेरे पास स्क्रिप्ट में परिभाषित कुछ कार्य हैं जिन्हें मैं माता-पिता में उपयोग करना चाहूंगा। वहाँ वैसे भी है कि प्राप्त करने के लिए? या क्या मैं भाग्य से बाहर हूं और एकमात्र उपाय उस स्क्रिप्ट को एक अस्थायी फ़ाइल में कॉपी करना है और फिर उसे स्रोत बनाना है?
हर्ष पांडे

86

यह कुछ तर्क (arg1 arg2) को पास करने के साथ दूरस्थ स्क्रिप्ट को निष्पादित करने का तरीका है:)

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

2
bash <(curl ... ) यदि आप स्टड का उपयोग करते हैं तो यह स्टिकी: \ का उपयोग करता है
फ्लोर्स रॉबल्स

47

बैश, बॉर्न शेल और मछली के लिए:

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

झंडा "-s" स्टड से खोल पढ़ा जाता है।


1
यह ज्यादातर गोले में काम करना चाहिए, जबकि स्वीकृत जवाब मछली के साथ काम नहीं करता है , उदाहरण के लिए।
होइजुई

16

का उपयोग करते हुए wget, जो आमतौर पर डिफ़ॉल्ट सिस्टम इंस्टॉलेशन का हिस्सा होता है:

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

RTFM: gnu.org/software/wget/manual/wget.html । ||| -q == --quiet == "Wget का आउटपुट बंद करें।" ||| -O- == --आउटपुट-डॉक्यूमेंट = - == यदि '-' का उपयोग फाइल के रूप में किया जाता है, तो दस्तावेजों को मानक आउटपुट पर प्रिंट किया जाएगा।
अमरा



11

आप यह भी कर सकते हैं:

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

11

इसे करने का सबसे अच्छा तरीका है

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

जो @ user77115 द्वारा उत्तर का एक मामूली परिवर्तन है


6

मैं अक्सर निम्नलिखित का उपयोग करने के लिए पर्याप्त है

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

लेकिन एक पुरानी प्रणाली में (कर्नेल 2.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
अंतिम पट्टी का क्या मतलब है?
शाम

बैश मैन पेज से: ए - विकल्पों के अंत का संकेत देता है और आगे के विकल्प प्रसंस्करण को अक्षम करता है। के बाद किसी भी तर्क को फ़ाइल नाम और तर्क के रूप में माना जाता है। का एक तर्क - के बराबर है।
मिंगजियांग शि

3

बस अमरा और 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:~$ 

यह सीधे गलत है। पोस्ट करने से पहले अपनी स्क्रिप्ट का परीक्षण करें और नकली आउटपुट न करें।
कॉर्कमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.