কেন এই বাশ কাঁটাচামচ বোমাগুলি আলাদাভাবে কাজ করে এবং এর & এর তাত্পর্য কী?


16

একটি সাধারণ কাঁটাচামচ বোমা কীভাবে কাজ করে তা আমি পেয়েছি তবে সাধারণ ব্যাশ কাঁটাচামচ বোমা কেন & কেন প্রয়োজন এবং এই স্ক্রিপ্টগুলি কেন অন্যরকম আচরণ করে তা আমি সত্যিই বুঝতে পারি না:

:(){ (:) | (:) }; :

এবং

:(){ : | :& }; :

প্রাক্তন আমাকে লগইন স্ক্রিনে ফেরত দেওয়ার আগে সিপিইউ ব্যবহারের স্পাইক তৈরি করে। পরেরটির পরিবর্তে আমার সিস্টেমটি হিমশীতল হয়ে যায়, আমাকে শক্ত পুনরায় বুট করতে বাধ্য করে। তা কেন? উভয়ই ক্রমাগত নতুন প্রক্রিয়া তৈরি করে, তবে কেন সিস্টেমটি আলাদা আচরণ করে?

উভয় স্ক্রিপ্ট থেকে পৃথক আচরণ করে

:(){ : | : }; :

যা একেবারেই কোনও সমস্যা সৃষ্টি করে না, যদিও আমি সেগুলি একই রকমের আশা করতাম। বাশ ম্যানুয়াল পৃষ্ঠাতে বলা হয়েছে যে পাইপলাইনে কমান্ডগুলি ইতিমধ্যে একটি সাব-শেলের মধ্যে কার্যকর করা হয়েছে, সুতরাং আমি এটি বিশ্বাস করতে পরিচালিত করেছি: | : ইতিমধ্যে যথেষ্ট করা উচিত। আমি বিশ্বাস করি এবং কেবল একটি নতুন সাবশেলে পাইপলাইনটি চালানো উচিত, তবে কেন এত পরিবর্তন হয়?

সম্পাদনা করুন: এইচটিপি ব্যবহার করে এবং প্রক্রিয়াগুলির পরিমাণ সীমিত করে, আমি দেখতে সক্ষম হয়েছি যে প্রথম বৈকল্পটি প্রকৃতির প্রকৃত বৃক্ষ তৈরি করে, দ্বিতীয় বৈকল্পটি একই স্তরের সমস্ত প্রক্রিয়া তৈরি করে এবং শেষ রূপটি কোনও প্রক্রিয়া তৈরি করে বলে মনে হয় না seem মোটেই এটি আমাকে আরও বিভ্রান্ত করে, তবে সম্ভবত এটি কোনওরকম সাহায্য করে?


2
আমি মনে করি আপনার শেষ রূপটি একটি সেমিকোলন অনুপস্থিত::(){ : | :; }; :
অ্যাডোনিস

উত্তর:


22

সতর্কতা একটি উত্পাদন মেশিন এ চালানোর চেষ্টা করবেন না। জাস্ট করবেন না। সতর্কতা: যে কোনও "বোমা" ulimit -uব্যবহারের চেষ্টা করা নিশ্চিত করুন । নীচে পড়ুন [ক]

পিআইডি এবং তারিখ (সময়) পেতে একটি ফাংশন সংজ্ঞায়িত করা যাক:

bize:~$ d(){ printf '%7s %07d %s\n' "$1" "$BASHPID" "$(date +'%H:%M:%S')"; }

bombনতুন ব্যবহারকারীর জন্য একটি সহজ, নন-ইস্যু ফাংশন (নিজেকে রক্ষা করুন: পড়ুন [ক] ):

bize:~$ bomb() { d START; echo "yes"; sleep 1; d END; } >&2

যখন সেই ফাংশনটি কার্যকর করতে বলা হয় তখন এটি কাজ করে:

bize:~$ bomb
  START 0002786 23:07:34
yes
    END 0002786 23:07:35
bize:~$

কমান্ডটি dateকার্যকর করা হয়, তারপরে একটি "হ্যাঁ" মুদ্রিত হয়, 1 সেকেন্ডের জন্য ঘুম হয়, সমাপ্তি কমান্ডটি dateএবং অবশেষে, ফাংশনটি একটি নতুন কমান্ড প্রম্পট প্রিন্ট করে প্রস্থান করে। অভিনব কিছু না।

| নল

আমরা যখন ফাংশনটিকে এভাবে কল করি:

bize:~$ bomb | bomb
  START 0003365 23:11:34
yes
  START 0003366 23:11:34
yes
    END 0003365 23:11:35
    END 0003366 23:11:35
bize:~$

দুটি কমান্ড কিছু সময় শুরু হয়, দুই প্রান্তটি 1 সেকেন্ড পরে এবং তারপরে প্রম্পট ফিরে আসে।

|সমান্তরালভাবে দুটি প্রক্রিয়া শুরু করার জন্য পাইপটির কারণ এটি ।

& পটভূমি

যদি আমরা কলটি পরিবর্তন করে একটি এন্ডিং যুক্ত করে &:

bize:~$ bomb | bomb &
[1] 3380
bize:~$
  START 0003379 23:14:14
yes
  START 0003380 23:14:14
yes
    END 0003379 23:14:15
    END 0003380 23:14:15

প্রম্পট তত্ক্ষণাত্ ফিরে আসে (সমস্ত ক্রিয়াটি পটভূমিতে প্রেরণ করা হয়) এবং দুটি কমান্ড পূর্বের মতো কার্যকর হয়। [1]প্রক্রিয়াটির পিআইডি এর আগে মুদ্রিত "জব নম্বর" এর মানটি দয়া করে নোট করুন 3380। পরে, পাইপটি শেষ হয়ে গেছে তা বোঝাতে একই সংখ্যাটি মুদ্রিত হবে:

[1]+  Done                    bomb | bomb

এটাই এর প্রভাব &

এই কারণগুলি &: দ্রুত প্রক্রিয়াগুলি শুরু করার জন্য।

সহজ নাম

bদুটি কমান্ড কার্যকর করতে আমরা একটি ফাংশন তৈরি করতে পারি । তিন লাইনে টাইপ করা:

bize:~$ b(){
> bomb | bomb
> }

এবং হিসাবে মৃত্যুদন্ড কার্যকর:

bize:~$ b
  START 0003563 23:21:10
yes
  START 0003564 23:21:10
yes
    END 0003564 23:21:11
    END 0003563 23:21:11

নোট করুন যে আমরা ;সংজ্ঞায়িতভাবে কোনও ব্যবহার bকরিনি (নিউলাইনগুলি পৃথক উপাদানগুলির জন্য পৃথক ব্যবহৃত হয়েছিল)। তবে, একটি লাইনে একটি সংজ্ঞায়নের জন্য এটি ব্যবহার করা স্বাভাবিক ;:

bize:~$ b(){ bomb | bomb ; }

বেশিরভাগ স্পেসও বাধ্যতামূলক নয়, আমরা সমমানের (তবে কম পরিষ্কার) লিখতে পারি:

bize:~$ b(){ bomb|bomb;}

আমরা &আলাদা করতে একটিও ব্যবহার করতে পারি }(এবং দুটি প্রক্রিয়াটিকে ব্যাকগ্রাউন্ডে প্রেরণ করুন)।

বোমা।

যদি আমরা ফাংশনটিকে তার লেজটি কামড়ায় তোলে (নিজেকে ডেকে), আমরা "কাঁটাচামচ" পেয়ে যাই:

bize:~$ b(){ b|b;}       ### May look better as b(){ b | b ; } but does the same.

এবং এটি আরও ফাংশনকে দ্রুত কল করতে, পাইপটিকে ব্যাকগ্রাউন্ডে প্রেরণ করুন।

bize:~$ b(){ b|b&}       ### Usually written as b(){ b|b& }

যদি আমরা প্রয়োজনীয়তার পরে প্রথম কলটি ফাংশনে সংযোজন করি ;এবং নামটি :আমাদের পেতে পারি:

bize:~$ :(){ :|:&};:

সাধারণত হিসাবে লেখা :(){ :|:& }; :

বা, মজাদার উপায়ে লেখা হয়েছে অন্য কোনও নামের সাথে (একটি তুষার-মানুষ):

☃(){ ☃|☃&};☃

উলিমিট (এটি চালানোর আগে আপনার যা নির্ধারণ করা উচিত) প্রচুর ত্রুটির পরে প্রম্পটটি দ্রুত ফিরিয়ে আনবে (ত্রুটি তালিকা প্রম্পটটি পেতে থামলে এন্টার টিপুন)।

একে "কাঁটাচামচ" বলা হওয়ার কারণ হ'ল শেলটি উপ-শেলটি যেভাবে শুরু করে তা চলমান শেলটি কাঁটাচামচ করে এবং তারপরে চালানো কমান্ড দিয়ে কাঁটাচামচ প্রক্রিয়াতে এক্সেক () কল করে।

একটি পাইপ দুটি নতুন প্রক্রিয়া "কাঁটাচামচ" করবে। অনন্তকে এটি করার ফলে বোমা ফেলার কারণ হয়।
বা খরগোশকে প্রাথমিকভাবে বলা হয়েছিল কারণ এটি এত তাড়াতাড়ি পুনরুত্পাদন করে।


টাইমিং:

  1. :(){ (:) | (:) }; time :

    বাস্তব 0 মি 45.627 গুলি সমাপ্ত

  2. :(){ : | :; }; time :
    সমাপ্ত
    বাস্তব 0m15.283s

  3. :(){ : | :& }; time :
    বাস্তব 0m00.002 s
    এখনও চলছে


আপনার উদাহরণ:

  1. :(){ (:) | (:) }; :

    দ্বিতীয় সমাপনিটি যেখানে )পৃথক হয় }এটি একটি আরও জটিল সংস্করণ :(){ :|:;};:। পাইপের প্রতিটি কমান্ডকে যাইহোক উপ-শেলের ভিতরে কল করা হয়। যা এর প্রভাব ()

  2. :(){ : | :& }; :

    কোনও শূন্যস্থান নেই বলে লিখিত দ্রুত সংস্করণ: :(){(:)|:&};:(১৩ টি অক্ষর)।

  3. :(){ : | : }; : ### zsh এ কাজ করে তবে ব্যাশে নয়।

    সিনট্যাক্স ত্রুটি (ব্যাশে) রয়েছে, সমাপ্তির আগে একটি মেটাচ্যারাক্টরের প্রয়োজন }, এটি
    যেমন:

    :(){ : | :; }; :

[এ] একটি নতুন পরিষ্কার ব্যবহারকারী তৈরি করুন (আমি আমার ফোন করবbize)। কনসোলে এই নতুন ব্যবহারকারীর লগইন করুনsudo -i -u bize, বা:

$ su - bize
Password: 
bize:~$

max user processesসীমাটি পরীক্ষা করে দেখুন এবং তারপরে :

bize:~$ ulimit -a           ### List all limits (I show only `-u`)
max user processes              (-u) 63931
bize:~$ ulimit -u 10        ### Low
bize:~$ ulimit -a
max user processes              (-u) 1000

মাত্র 10 কাজ ব্যবহার করার যেমন শুধুমাত্র একটি নির্জন নতুন ব্যবহারকারী হল: bizekillall -u bizeসিস্টেমটিকে কল করা এবং বেশিরভাগ (সমস্ত নয়) বোমা থেকে মুক্তি পাওয়া সহজ করে তোলে । কোনটি এখনও কাজ করে তা জিজ্ঞাসা করবেন না, আমি বলব না। তবে তবুও: বেশ কম তবে নিরাপদ দিকে, আপনার সিস্টেমে মানিয়ে নিন
এটি নিশ্চিত করবে যে একটি "কাঁটাচামচ বোমা" আপনার সিস্টেমটিকে ভেঙে ফেলবে না

আরও পড়া:

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