পথহীন শেবাং ব্যবহার করবেন না কেন?


24

কোনও শেবাং পাওয়া কি সম্ভব যে কোনও দোভাষীর পাথ নির্দিষ্ট করার পরিবর্তে এটির অনুবাদকের নাম রয়েছে এবং শেলটি এটি $ PATH- এর মাধ্যমে খুঁজে পেতে দেয়?

যদি তা না হয়, তার কারণ আছে কি?


উত্তর:


20

PATH লুকোচুরি ইউজার স্পেসের স্ট্যান্ডার্ড সি লাইব্রেরির বৈশিষ্ট্য, যেমন সাধারণভাবে পরিবেশের পরিবর্তনশীল। কলার থেকে execveনতুন প্রক্রিয়াতে পরিবেশের পাশ দিয়ে যাওয়া ছাড়া কার্নেলটি পরিবেশের পরিবর্তনগুলি দেখতে পাবে না ।

কার্নেলটি পথটিতে (এটি প্যাটার লুক করা execveযেমন র‍্যাপার ফাংশনগুলির উপর নির্ভর করে execvp) বা শেবাংয়ে (যা কমবেশি execveঅভ্যন্তরীণভাবে কলটিকে পুনরায় যাত্রা করে ) কোনও ব্যাখ্যা সম্পাদন করে না । সুতরাং আপনাকে শিবাঙ্গায় পরম পথ স্থাপন করা দরকার ¹ মূল কুঁড়েঘর বাস্তবায়ন শুধু একটি কোড কয়েক লাইন ছিল, এবং এটি উল্লেখযোগ্যভাবে যেহেতু না সম্প্রসারণ করা হয়েছে।

ইউনিক্সের প্রথম সংস্করণগুলিতে শেলটি নিজেই ডাকে কাজ করার কাজটি করল যখন আপনি যখন দেখলেন যে আপনি কোনও স্ক্রিপ্ট চালু করছেন inv শ্যাবাং বেশ কয়েকটি কারণে কর্নেলের সাথে যুক্ত হয়েছিল ( ডেনিস রিচি দ্বারা যুক্তির সংক্ষিপ্তসার :

  • কলকারীকে চিন্তিত হওয়ার দরকার নেই যে কার্যকর করার প্রোগ্রামটি শেল স্ক্রিপ্ট বা নেটিভ বাইনারি কিনা।
  • কলকারীর পরিবর্তে স্ক্রিপ্ট নিজেই কোন দোভাষী ব্যবহার করতে হবে তা নির্দিষ্ট করে।
  • কার্নেল লগিতে স্ক্রিপ্টের নাম ব্যবহার করে।

পথবিহীন শেবাংগুলিকে হয় পরিবেশের ভেরিয়েবল এবং প্রক্রিয়া অ্যাক্সেস করার জন্য কার্নেলটি বাড়িয়ে তোলার প্রয়োজন হবে PATH, বা কার্নেলটি একটি PATH চেহারা সম্পাদনকারী একটি ইউজারস্পেস প্রোগ্রাম কার্যকর করতে পারে। প্রথম পদ্ধতিটির জন্য কার্নেলের সাথে অপ্রাসঙ্গিক পরিমাণে জটিলতা যুক্ত করা দরকার। দ্বিতীয় পদ্ধতিটি ইতিমধ্যে একটি #!/usr/bin/envশেবাং দিয়ে সম্ভব ।

You আপনি যদি কোনও আপেক্ষিক পথ রাখেন তবে এটি প্রক্রিয়াটির বর্তমান ডিরেক্টরিতে (স্ক্রিপ্টযুক্ত ডিরেক্টরি নয়) তুলনামূলকভাবে ব্যাখ্যা করা হয়, যা কোনও শেবাংয়ে খুব কমই কার্যকর।


2
না, execveশ্যাবাংয়ে বা শ্যাবাংয়ে কার্নেলের কোনও নিখুঁত পথের প্রয়োজন নেই যদিও শেবাংয়ে এটি সম্পর্কিত কোনও আপত্তি নেই have
স্টাফেন চেজেলাস

3
"শেবাং কীভাবে অভ্যন্তরীণভাবে নির্বাহকারী কলটিকে পুনরায় চালিত করে" সম্পর্কে কৌতূহল রয়েছে: এটি প্রকৃত বাস্তবায়িতদের উপর দোভাষীদের চালানোর জন্য একটি জেনেরিক প্রক্রিয়ার অংশ যা তাদের প্রয়োজন। গতিযুক্ত-লিঙ্কযুক্ত ইএলএফ এক্সিকিউটেবলগুলি "ব্যাখ্যা" দ্বারা /lib64/ld-linux-x86-64.so.2( lddআউটপুট দেখুন) are লিনাক্স এটি পুরোপুরি জেনেরিক করে তোলে: binfmtসমর্থন (২.১.৪৩ থেকে) আপনাকে ইন্টারপ্রিটার-পাথ / ম্যাজিক-সংখ্যা-বা-ফাইল-এক্সটেনশান জোড়া নিবন্ধ করতে দেয়। আপনি PE32 থাকতে পারে .exeগুলি ডাকা wineযখন আপনি তাদের চালানোর জন্য, জাভা শ্রেণী এবং বয়াম ফাইল ডাকা javaইত্যাদি ইত্যাদি
পিটার Cordes

#! / usr / bin / env -S [শেবাং] এর জন্য আমার নোডের পথটি না জেনে চালানোর প্রয়োজন ছিল (এনভিএম ব্যবহার করে - যা এটি আমার প্রত্যাশার চেয়ে পৃথক স্থানে রাখে)।
টমুসজেয়ার্স

-এস কেবল কোরিউটিলস 8.30 থেকে পাওয়া যায়। Gitlab.com/gnuwget/wget/commit/… দেখুন ।
টিম রুহেন রকডবूट

19

চোখের সাক্ষাতের চেয়ে আরও অনেক কিছু চলছে। #!লাইনগুলি ইউনিক্স বা লিনাক্স কার্নেল দ্বারা ব্যাখ্যা করা হয়, #!শাঁসের কোনও দিক নয়। এর অর্থ PATHকার্নেল কোনটি কার্যকর করতে হবে তা স্থির করে এমন সময়ে সত্যই উপস্থিত নেই।

কোন এক্সিকিউটিভ চালানো হবে না জেনে বা perlপোর্টেবল ফ্যাশনে বা অনুরূপ কল করার জন্য সর্বাধিক সাধারণ উপায় হ'ল ব্যবহার করা #!/usr/bin/env perl। কার্নেল কার্যকর করে /usr/bin/env, যা PATHপরিবেশের পরিবর্তনশীল হিসাবে উত্তরাধিকার সূত্রে প্রাপ্ত হয়। env(এই উদাহরণে) খুঁজে বের করে perlPATHও ব্যবহার করে execve(2)সিস্টেম কল চালানোর জন্য কার্নেল পেতে perlএক্সিকিউটেবল।


4
$ strace sleep 1
execve("/usr/bin/sleep", ["sleep", "1"], [/* 99 vars */]) = 0

পুরো পথে রূপান্তরটি শেল (আরও সাধারণ: ব্যবহারকারীক্ষেত্রের) দ্বারা সম্পন্ন হয়। কার্নেলটি কোনও ফাইলের নাম / পাথের মাধ্যমে এটি সরাসরি অ্যাক্সেস করতে পারে exp

আপনি যদি PATH ভেরিয়েবলটি দেখে সিস্টেমটিকে আপনার নির্বাহযোগ্য হিসাবে সন্ধান করতে চান তবে আপনি নিজের শেবাংকে আবার লিখতে পারেন #!/usr/bin/env EXEC

তবে এই ক্ষেত্রে এটি অনুসন্ধানের কর্নেলও নয়।


1
পুরো পথে রূপান্তরটি শেল থ্যাঙ্কস দ্বারা সম্পন্ন হয় , যদিও ... উদাহরণটি কি এটি উদাহরণস্বরূপ বোঝানোর কথা? আমি এটি দেখতে পাচ্ছি, শেলটি কেবল 2 টি আর্গুমেন্টের সাথে চলছে strace( /usr/bin/straceকোনও কোনও সময়ে রূপান্তরিত )।
অ্যালোস মাহদল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.