`কার্লের মধ্যে পার্থক্য কী sh` এবং "sh -c" cur (কার্ল) "`?


23

ডকারের জন্য একটি সহজ ইনস্টল পদ্ধতি (উদাহরণস্বরূপ) এটি হ'ল:

curl -sSL https://get.docker.com/ | sh

তবে, আমি এমন কিছু লোককেও দেখতে পেয়েছি যা দেখতে দেখতে (ডকার উদাহরণ ব্যবহার করে):

sh -c "$(curl -sSL https://get.docker.com/)"

এগুলি কার্যকরীভাবে একইরূপে উপস্থিত দেখা যায়, তবে একে অপরকে ব্যবহার করার কোনও কারণ আছে কি? বা এটি কি কেবল একটি পছন্দ / নান্দনিক জিনিস?

(দ্রষ্টব্য, অজানা উত্স থেকে স্ক্রিপ্ট চালানোর সময় খুব সাবধানতা অবলম্বন করুন))

উত্তর:


40

ব্যবহারিক পার্থক্য আছে।

curl -sSL https://get.docker.com/ | shআরম্ভ হয় curlএবং shএকই সাথে, curlএর ইনপুট সঙ্গে আউটপুট সংযোগ sh। স্ক্রিপ্টটি চালাতে পারে curlতত দ্রুত ডাউনলোড (মোটামুটি) সাথে shচালিত করবে। সার্ভারটি সময়কালে অনিয়মগুলি সনাক্ত করতে পারে এবং কোনও ফাইল বা বাফারে রিসোর্সটি ডাউনলোড করার সময় বা ব্রাউজারে দেখার সময় এটি দূষিত কোডটি দৃশ্যমান হয় না not

ইন sh -c "$(curl -sSL https://get.docker.com/)", curlচালানোর আগে কঠোরভাবে shচালানো হয়। রিসোর্সের পুরো বিষয়বস্তু ডাউনলোড shশুরু হয়ে যাওয়ার আগে আপনার শেলের কাছে চলে যায় passed আপনার শেলটি কেবল shতখনই শুরু হয় যখন curlপ্রস্থান হয় এবং উত্সটির পাঠ্যটি এতে প্রবেশ করে। সার্ভার shকল সনাক্ত করতে পারে না ; এটি কেবল সংযোগ শেষ হওয়ার পরে শুরু হয়। এটি প্রথমে কোনও ফাইলটিতে স্ক্রিপ্ট ডাউনলোড করার অনুরূপ।

(এটি ডকারের ক্ষেত্রে প্রাসঙ্গিক নাও হতে পারে তবে এটি সাধারণভাবে সমস্যা হতে পারে এবং দুটি আদেশের মধ্যে ব্যবহারিক পার্থক্য তুলে ধরে ights)


2
ধন্যবাদ, এটি উভয়ের মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্যের মতো বলে মনে হচ্ছে।
সার্কে

আপনি কি এই দাবিকে ব্যাক আপ করার কোনও উত্স উদ্ধৃত করতে পারেন? সার্ভার কীভাবে 'শ' কল সনাক্ত করতে পারে তা জানার জন্য আমি খুব আগ্রহী হব।
আলফ্রেড আর্মস্ট্রং

1
@ অ্যালফ্রেডআর্মস্ট্রং উহম, আমি এই শব্দটির সাথে একটি লিঙ্ক রেখেছি vulnerable to server-side detection। এটি এমন একটি ব্লগ পোস্টের দিকে নিয়ে যায় যা তারা কীভাবে এটি অর্জন করবে সে সম্পর্কে বিশদভাবে ব্যাখ্যা করে। টিএল; ডিআর: আপনার স্ক্রিপ্টে একটি নিদ্রা রেখে সার্ভারে অভ্যর্থনা বিলম্ব পর্যবেক্ষণ করুন।
জোনাস শ্যাফার

1
@ জোনাস উইলিকি ধন্যবাদ - লিঙ্কটি খুব পরিষ্কার ছিল না - আপনার দোষ নয়, এসই এর সিএসএসে আমি মনে করি। মানুষ উজ্জ্বল স্নিগ্ধ, তাই না? :)
আলফ্রেড আর্মস্ট্রং

1
এর সবগুলিই আমাকে অবাক করে দেয় যে কেউ যদি কখনও তাত্ক্ষণিকভাবে ধরা না পড়ে বাস্তবে বাস্তবে সেই কৌশলটি চেষ্টা করে। এটি সম্ভবত খুব বেশি গুরুত্বপূর্ণ নয় যেহেতু আপনি সম্ভবত স্ক্রিপ্টটি এমন কৌশল ছাড়াও কিছু দূষিত কিছু করতে পেরেছিলেন এবং যে কেউ এটি পুরোপুরি না পড়েন তারা দুর্বল হয়ে পড়বেন।
ilkkachu

11

আমি বিশ্বাস করি যে তারা কার্যত অভিন্ন। যাইহোক, বিরল ক্ষেত্রে যেখানে তারা পৃথক হয়।

$(cmd)এর ফলাফলের সাথে প্রতিস্থাপিত হয় cmd। যদি ফলাফল কমান্ডের দৈর্ঘ্য যদি প্রদত্ত সর্বোচ্চ আর্গুমেন্ট দৈর্ঘ্যের মানটি অতিক্রম করে getconf ARG_MAX, তবে ফলাফলটি কেটে যাবে, যার ফলশ্রুতি অনাকাঙ্ক্ষিত ফলাফল হতে পারে।

পাইপ বিকল্পের এই সীমাবদ্ধতা নেই। curlকমান্ড থেকে আউটপুট প্রতিটি লাইন bashপাইপ থেকে আগত হিসাবে এটি কার্যকর করা হবে।

তবে এআরজি_ম্যাক্স সাধারণত 256,000 চরিত্রের মধ্যে থাকে। ডকার ইনস্টলের জন্য, আমি উভয় পদ্ধতি ব্যবহার করে আত্মবিশ্বাসী থাকব। :-)


আকর্ষণীয়, তাই একটি পার্থক্য আছে। ধন্যবাদ
সার্কে

1
সন্দেহ হলে পাইপ পদ্ধতিটি ব্যবহার করুন। আমি আমার উত্তরে একটি অগ্রাধিকার নির্দিষ্ট করেছিলাম না, তবে আমি এই ধরণের ব্যবহারের জন্য পাইপ পদ্ধতিটি পছন্দ করব কারণ পাইপের মাধ্যমে আপনি কী পরিমাণ ডেটা আসছে তা আপনি কখনই জানেন না।
গ্রেগ তার্সা

2
"এটি ফলাফলকে ছাঁটাই করবে" - শেলটি এর জন্য একটি ত্রুটি বার্তা জারি করবে, নীরবে কাটা যাবে না। পরীক্ষার সময়, আমি এমনকি শেল থেকে খুব নীচে একটি ত্রুটি পেয়েছি ARG_MAX, বাশ আমার সিস্টেমে পৃথক যুক্তি 131072 বাইটের মধ্যে সীমাবদ্ধ করে, যখন getconf ARG_MAXমুদ্রণ করে 2097152। তবে যেভাবেই হোক না কেন ত্রুটি বা ছাঁটাই, এটি কার্যকর হবে না।
এইচডিভি

তবে বোর্ন শেলের পুরানো বাস্তবায়নের সীমা অনেক কম ছিল। 4.2BSD এ সীমা ছিল 10240 অক্ষর, এবং পূর্ববর্তী সিস্টেমে এটি আরও কম ছিল .. অবশ্যই এটি 30 বছর আগে ছিল, সুতরাং আজ আপনার এত কম সীমাবদ্ধতার মুখোমুখি হওয়ার সম্ভাবনা কম। যদি আমি সঠিকভাবে স্মরণ করি তবে এই প্রাথমিক শেলগুলির মধ্যে কিছুগুলি কেবল নিঃশব্দে কেটে গেছে।
অ্যান্ডি

একক যুক্তির জন্য 128 কেবি সীমা একটি লিনাক্স জিনিস, এটি বাশের সম্পর্কে নয় about
ilkkachu

8

ইন curl -sSL https://get.docker.com/ | sh:

  • উভয় কমান্ড, curlএবং sh, স্ব স্ব সাবহেলগুলিতে একই সাথে শুরু হবে

  • থেকে stdout- এ curlথেকে stdin হিসাবে পাস হবে sh(এই কি পাইপ হল |, না)

যেখানে এতে sh -c "$(curl -sSL https://get.docker.com/)":

  • কমান্ড সাবস্টিটিউশন, $()প্রথমে কার্যকর করা curlহবে অর্থাৎ একটি সাব-শেলতে প্রথমে চালানো হবে

  • কমান্ড সাবস্টিটিউশন, এর $()থেকে STDOUT দ্বারা প্রতিস্থাপন করা হবেcurl

  • sh -c (অ-ইন্টারেক্টিভ, নন-লগইন শেল) এর থেকে STDOUT কার্যকর করবে curl


1
সুতরাং, কোন বাস্তব পার্থক্য আছে?
সার্কে

@ সার্কে হ্যাঁ, তাত্ত্বিকভাবে আমি যেমন উল্লেখ করেছি, তবে কার্যত এটি খুব কম লক্ষণীয়। (আপনি যদি কমান্ড প্রতিস্থাপনটি অব্যক্ত রেখে দেন তবে এটি দৃশ্যমান হবে))
হিমাইল

1
@ সার্ক, যদি স্ক্রিপ্টগুলি পুরোপুরি ডাউনলোড না করা হয় তবে আপনি পাইপ দিয়ে অগত্যা তা লক্ষ্য করবেন না। প্রক্রিয়াটি পাইপ করা হচ্ছে যা এই সংকেতটিকে উপেক্ষা করতে পারে।
জানুস ট্রয়লসন

@ জনাসট্রোয়েলসন সম্পূর্ণরূপে ডাউনলোড না হয়ে কী বোঝাতে চাইছেন? সার্ভারের ত্রুটি ব্যতীত কেন এমনটি ঘটবে যেখানে কোনও ক্ষেত্রে পাইপযুক্ত কিছু থাকবে না।
hasufell

বা সংযোগ বিঘ্নিত ... একটি স্থানান্তর ব্যর্থ হতে পারে এমন অনেকগুলি উপায় রয়েছে
জানুস ট্রয়লসেন

0

উভয়ের মধ্যে একটি পার্থক্য (ওয়েব জুড়ে অন্যান্য উত্তর থেকে নেওয়া) হ'ল আপনি যদি একবারে পুরো স্ক্রিপ্টটি ডাউনলোড না করেন তবে এটি কোনও অজানা স্থানে স্ক্রিপ্টের অর্ধেক পথ কেটে ফেলতে পারে এবং কমান্ডের অর্থটি পরিবর্তন করতে পারে নিষ্পন্ন. সুতরাং মনে হয় প্রথমে পুরো ফাইলটি ডাউনলোড করা এবং তারপরে এটি মূল্যায়ন করা আরও ভাল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.