शेल से कर्ल करने से पहले शेल स्क्रिप्ट पढ़ें और पुष्टि करें (कर्ल -s [url] | श |


11

जब भी मुझे वेब से शेल स्क्रिप्ट को निष्पादित करना होता है curl -s [url] | sh, तो मैं urlयह सुनिश्चित करने के लिए अपने वेब ब्राउज़र में सबसे पहले खोलता हूं कि स्क्रिप्ट दुर्भावनापूर्ण नहीं है और चलाने के लिए सुरक्षित है।

मुझे याद है कि एक कमांड लाइन ट्रिक देखकर जिसने कमांड लाइन से स्क्रिप्ट को पढ़ना संभव किया और फिर स्क्रिप्ट पढ़ने के बाद निष्पादन की पुष्टि की। अगर मुझे सही से याद है, तो यह कुछ ऐसा दिखता curl -s [url] | something...here | shथा और इसके लिए किसी सॉफ्टवेयर इंस्टॉल की आवश्यकता नहीं थी।

क्या कोई इस ट्रिक को जानता है?

जवाबों:


5

वहाँ एक उपयोगिता में है moreutilsकहा जाता है vipeकि पता चलता है एक संपादक, जहाँ आप revew और इससे पहले कि यह stdout को पारित हो जाता है फ़ाइल को संशोधित कर सकते हैं में stdin।

यदि आप स्थापित नहीं करना चाहते हैं moreutils, तो आप कुछ ऐसा ही पूरा कर सकते हैं:

file=$(mktemp); curl -s "$url" > $file; $EDITOR $file; sh $file; rm $file

mktempमें है coreutilsऔर बहुत संभावना पहले से ही आपके सिस्टम पर स्थापित किया गया है।


2

मैं एक भी उपयोगिता के बारे में नहीं सोच सकता जो आप बताएंगे, लेकिन यह इतना आसान है कि एक शेल स्निपेट बनाया जाए।

script=$(curl -s "$url")
printf "%s\nDo you want to run this script? [yN]" "$script"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh -c "$script";;
esac

यह मानता है कि स्क्रिप्ट एक पाठ फ़ाइल है। अशक्त बाइट्स का समर्थन नहीं किया जाता है: शेल के आधार पर, उन्हें हटाया जा सकता है, या वे एक पंक्ति या पूरी फ़ाइल को काट दिया जा सकता है। इसके अलावा फ़ाइल के अंत में सभी नई सुर्खियों को हटा दिया जाता है (हेरेडोक निर्माण एक वापस जोड़ता है)। यह आम तौर पर एक स्क्रिप्ट के लिए कोई समस्या नहीं है, लेकिन यह उदाहरण के लिए हो सकता है, अगर स्क्रिप्ट बाइनरी प्रारूप में एक संग्रह के साथ समाप्त होती है जो इसे निकालती है। यह फ़ाइल को वितरित करने का एक बहुत विश्वसनीय तरीका नहीं है क्योंकि किसी बिंदु पर गलत बाइनरी स्क्रिप्ट होने का एक महत्वपूर्ण जोखिम है। बहरहाल, आप इसे एक अस्थायी फ़ाइल में स्क्रिप्ट लिखकर संभाल सकते हैं।

script_file=$(mktemp)
curl -s "$url" | tee "$script_file"
printf "Do you want to run this script? [yN]"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh "$script_file";;
esac
rm "$script_file"

$()पहली पंक्ति पर उद्धृत किया जाना चाहिए। इसके अलावा, यह इनपुट में एनयूएल वर्णों को हटा देगा, जो संभवतया घातक हो सकता है (उदाहरण के लिए एक स्व-निष्कर्षण स्क्रिप्ट के मामले में)।
l0b0

1
@ l0b0 आपको असाइनमेंट में उद्धृत करने की आवश्यकता नहीं है, हालांकि यह यकीनन अच्छी शैली है । अशक्त बाइट्स वास्तव में खो जाते हैं, जैसा कि अंतिम newlines हैं; यदि आप शेल स्क्रिप्ट में एक संग्रह शामिल करने जा रहे हैं, तो मैं बेस 64 जैसे टेक्स्ट एन्कोडिंग का उपयोग करने की सलाह देता हूं।
गिलेस एसओ- बुराई को रोकना '

सभी मान्य बिंदु, हमेशा की तरह। +1
l0b0

@ l0b0 दूसरे विचारों पर, जबकि यह कुछ हद तक जोखिम भरा है, यह एक वैध उपयोग मामला है। मैंने अपना उत्तर अपडेट कर दिया है। मैंने अपने मूल उत्तर में एक दोष भी ठीक कर लिया है, जिसने स्क्रिप्ट को अपने स्टाइन का उपयोग करने की अनुमति नहीं दी थी (क्योंकि स्क्रिप्ट बिना किसी अच्छे कारण के लिए स्टड पर पारित किया गया था)।
गिलेस एसओ- बुराई को रोकना '

1

यह कल्पना करना मुश्किल है कि आप ऐसा क्यों करना चाहते हैं, अकेले जाने दें जहां आपको स्क्रिप्ट का एक स्रोत (या स्रोत) मिलेगा जो इस तरह से डाउनलोड और चलाने के लिए अक्सर पर्याप्त होता है कि उसे एक विशेष-उद्देश्य उपकरण की आवश्यकता होती है।

केवल स्क्रिप्ट को curl(या wgetया snarfजो भी) से डाउनलोड क्यों न किया जाए , उसकी जांच करें और उसे संपादित करें (यह एक दुर्लभ स्क्रिप्ट है जिसे आपके विशेष सिस्टम के लिए कुछ अनुकूलन की आवश्यकता नहीं होगी) और फिर इसे चलाएं - या तो इसे chmodया इसके साथ निष्पादन योग्य बनाकर sh scriptname?


मैं एक विशेष प्रयोजन उपकरण नहीं चाहता। मुझे याद है कि मानक साधनों के साथ ऐसा करने का एक आसान तरीका था।
ओलिवियर लालोंडे

2
एक स्क्रिप्ट को डाउनलोड करने के लिए एक छोटी सी शेल स्क्रिप्ट (शायद केवल 5 या इतनी लाइनें) लिखना मुश्किल नहीं होगा, इसे lessकुछ या कुछ देखने के लिए प्रस्तुत करें , और फिर आपसे पूछें कि क्या आप इसे चलाना चाहते हैं। मैं यह नहीं देख सकता कि यह स्क्रिप्ट को डाउनलोड करने, उसे देखने और फिर ठीक लगने पर उसे चलाने से बेहतर होगा। IMO यह बदतर होगा, यह किसी भी लाभ की पेशकश नहीं करेगा, लेकिन आपके शेल में काम करने से मिलने वाले लचीलेपन को हटा देगा।
कैस

0

इस कमांड लाइन का उपयोग करें:

curl URL | ( cat > /tmp/file; read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) | sh

आप उसके लिए एक छोटे से फ़ंक्शन का उपयोग कर सकते हैं:

curlsh()
{
    curl "$1" \
    | ( cat > /tmp/file;read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) \
    | sh
}

और इस तरह से इसका उपयोग करें:

curlsh http://site.in.net/path/to/script

0

अपना पढ़ा पता -p (शीघ्र) मानकर , और स्क्रिप्ट को दुभाषिया के साथ निष्पादित नहीं किया जाना चाहिए, जो शेल्फ़ द्वारा निर्दिष्ट है:

curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.