কার্ল থেকে শ-তে কার্পেট করার আগে শেল স্ক্রিপ্টটি পড়ুন এবং নিশ্চিত করুন (কার্ল-এস [url] | sh)


11

যখনই আমাকে ওয়েব থেকে কোনও শেল স্ক্রিপ্ট কার্যকর করতে হবে, স্ক্রিপ্টটি দূষিত নয় এবং এটি চালানো নিরাপদ কিনা তা নিশ্চিত করতে curl -s [url] | shআমি প্রথমে urlআমার ওয়েব ব্রাউজারে খুলি ।

আমার মনে আছে একটি কমান্ড লাইন কৌশল দেখে কমান্ড লাইন থেকে স্ক্রিপ্টটি পড়া সম্ভব হয়েছিল এবং তারপরে স্ক্রিপ্টটি পড়ার পরে নির্বাহের বিষয়টি নিশ্চিত করা যায়। আমি যদি সঠিকভাবে স্মরণ করি তবে এটির মতো দেখতে কিছু লাগছিল curl -s [url] | something...here | shএবং কোনও সফ্টওয়্যার ইনস্টল করার প্রয়োজন নেই।

কেউ কি এই কৌশল জানেন?

উত্তর:


5

এখানে একটি ইউটিলিটি রয়েছে moreutilsযা vipeএকটি সম্পাদককে স্টাডিন দেখায়, যেখানে আপনি স্টাডআউটে যাওয়ার আগে ফাইলটি প্রকাশ এবং সংশোধন করতে পারবেন।

আপনি যদি ইনস্টল করতে না চান তবে আপনি এর moreutilsমতো কিছু করতে পারেন:

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

mktempcoreutilsআপনার সিস্টেমে ইতিমধ্যে ইনস্টল করা আছে এবং সম্ভবত likely


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"

$()প্রথম লাইনে উদ্ধৃত করা উচিত। এছাড়াও, এটি ইনপুটটিতে NUL টি অক্ষর মুছে ফেলবে, যা সম্ভবত মারাত্মক হতে পারে (উদাহরণস্বরূপ স্ব-উত্তোলনের স্ক্রিপ্টের ক্ষেত্রে)।
l0b0

1
@ l0b0 আপনার কোনও অ্যাসাইনমেন্টে উদ্ধৃতি দেওয়ার দরকার নেই, যদিও এটি যুক্তিযুক্তভাবে ভাল স্টাইল । চূড়ান্ত নিউলাইনগুলি যেমন নাল বাইটগুলি সত্যই হারিয়ে গেছে; আপনি যদি একটি শেল স্ক্রিপ্টে একটি সংরক্ষণাগার অন্তর্ভুক্ত করতে চলেছেন, আমি বেস 64 হিসাবে কোনও পাঠ্য এনকোডিং ব্যবহার করার পরামর্শ দিই।
গিলস 10:51-তে

যথারীতি সমস্ত বৈধ পয়েন্ট। +1
l0b0

@ l0b0 দ্বিতীয় চিন্তায়, যদিও এটি কিছুটা ঝুঁকিপ্রবণ, এটি একটি কার্যকর ব্যবহারের ক্ষেত্রে। আমি আমার উত্তর আপডেট করেছি। আমি আমার মূল উত্তরে একটি ত্রুটিও সংশোধন করেছি যা স্ক্রিপ্টটিকে তার স্টিডিন ব্যবহার করতে দেয়নি (কারণ কোনও কারণ ছাড়াই স্ক্রিপ্টটি স্টিডিনে পাস হয়েছিল)।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

1

আপনি কেন এটি করতে চান তা কল্পনা করা শক্ত, আপনি যেখানে স্ক্রিপ্টগুলি ডাউনলোড করতে এবং চালানোর জন্য এমন কোনও উত্স (বা উত্স) খুঁজে পান যেখানে এটি প্রায়শই যথেষ্ট প্রয়োজন যে এর জন্য একটি বিশেষ উদ্দেশ্য সরঞ্জাম প্রয়োজন।

কেন কেবল curl(বা wgetবা snarfযে কোনও) দিয়ে স্ক্রিপ্টটি ডাউনলোড করবেন না, এটি পরীক্ষা করুন এবং সম্পাদনা করুন (এটি একটি বিরল স্ক্রিপ্ট যা আপনার নির্দিষ্ট সিস্টেমের জন্য কিছু কাস্টমাইজেশন প্রয়োজন হবে না) এবং তারপরে এটি চালান - হয় এটির সাথে chmodবা এর সাথে এক্সিকিউটেবল তৈরি করে sh scriptname?


আমি একটি বিশেষ উদ্দেশ্যমূলক সরঞ্জাম চাই না। আমার মনে আছে স্ট্যান্ডার্ড সরঞ্জাম দিয়ে এটি করার একটি সহজ উপায় ছিল।
অলিভিয়ের লালনডে

2
একটি ছোট শেল স্ক্রিপ্ট (সম্ভবত কেবল 5 বা তাই লাইন) লিখতে কোনও স্ক্রিপ্ট ডাউনলোড করা, এটির সাথে lessবা কোনও কিছুর জন্য দেখার জন্য উপস্থাপন করা কঠিন হবে না এবং তারপরে আপনাকে জিজ্ঞাসা করুন আপনি এটি চালাতে চান কিনা। আমি দেখতে পাচ্ছি না যে এটি স্ক্রিপ্টটি ডাউনলোড করা, এটি দেখতে এবং এটি ঠিক আছে বলে মনে হচ্ছে তা চালানোর চেয়ে আরও ভাল কিছু হতে পারে। আইএমও এটি আরও খারাপ হবে, এটি কোনও সুবিধা দেয় না তবে আপনার শেলটিতে কাজ করার ফলে আপনি যে নমনীয়তা পান তা সরিয়ে ফেলবে।
সি এ এস

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

আপনার পঠন- পি (প্রম্পট) জেনে ধরে , এবং স্ক্রিপ্টটি শেবাং দ্বারা সুনির্দিষ্ট করে দোভাষীর সাহায্যে কার্যকর করা উচিত নয়:

curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.