সতর্কতা একটি উত্পাদন মেশিন এ চালানোর চেষ্টা করবেন না। জাস্ট করবেন না।
সতর্কতা: যে কোনও "বোমা" 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:~$ :(){ :|:&};:
সাধারণত হিসাবে লেখা :(){ :|:& }; :
বা, মজাদার উপায়ে লেখা হয়েছে অন্য কোনও নামের সাথে (একটি তুষার-মানুষ):
☃(){ ☃|☃&};☃
উলিমিট (এটি চালানোর আগে আপনার যা নির্ধারণ করা উচিত) প্রচুর ত্রুটির পরে প্রম্পটটি দ্রুত ফিরিয়ে আনবে (ত্রুটি তালিকা প্রম্পটটি পেতে থামলে এন্টার টিপুন)।
একে "কাঁটাচামচ" বলা হওয়ার কারণ হ'ল শেলটি উপ-শেলটি যেভাবে শুরু করে তা চলমান শেলটি কাঁটাচামচ করে এবং তারপরে চালানো কমান্ড দিয়ে কাঁটাচামচ প্রক্রিয়াতে এক্সেক () কল করে।
একটি পাইপ দুটি নতুন প্রক্রিয়া "কাঁটাচামচ" করবে। অনন্তকে এটি করার ফলে বোমা ফেলার কারণ হয়।
বা খরগোশকে প্রাথমিকভাবে বলা হয়েছিল কারণ এটি এত তাড়াতাড়ি পুনরুত্পাদন করে।
টাইমিং:
:(){ (:) | (:) }; time :
বাস্তব 0 মি 45.627 গুলি
সমাপ্ত
:(){ : | :; }; time :
সমাপ্ত
বাস্তব 0m15.283s
:(){ : | :& }; time :
বাস্তব 0m00.002 s
এখনও চলছে
আপনার উদাহরণ:
:(){ (:) | (:) }; :
দ্বিতীয় সমাপনিটি যেখানে )
পৃথক হয় }
এটি একটি আরও জটিল সংস্করণ :(){ :|:;};:
। পাইপের প্রতিটি কমান্ডকে যাইহোক উপ-শেলের ভিতরে কল করা হয়। যা এর প্রভাব ()
।
:(){ : | :& }; :
কোনও শূন্যস্থান নেই বলে লিখিত দ্রুত সংস্করণ: :(){(:)|:&};:
(১৩ টি অক্ষর)।
:(){ : | : }; :
### 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 কাজ ব্যবহার করার যেমন শুধুমাত্র একটি নির্জন নতুন ব্যবহারকারী হল: bize
। killall -u bize
সিস্টেমটিকে কল করা এবং বেশিরভাগ (সমস্ত নয়) বোমা থেকে মুক্তি পাওয়া সহজ করে তোলে । কোনটি এখনও কাজ করে তা জিজ্ঞাসা করবেন না, আমি বলব না। তবে তবুও: বেশ কম তবে নিরাপদ দিকে, আপনার সিস্টেমে মানিয়ে নিন ।
এটি নিশ্চিত করবে যে একটি "কাঁটাচামচ বোমা" আপনার সিস্টেমটিকে ভেঙে ফেলবে না ।
আরও পড়া:
:(){ : | :; }; :