ক্রোম ওএসে, বাশ আমার স্ক্রিপ্টটি কার্যকর করবে না। আমি কীভাবে আমার স্ক্রিপ্টটি চালাতে বাশকে পেতে পারি?


16

foo.shআমার বর্তমান ডিরেক্টরিতে আমার একটি ফাইল আছে । আমি যদি দৌড়ানোর চেষ্টা করি তবে আমি ./foo.shপেয়েছি:

-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied

তবে আমি যদি দৌড়ে যাই /bin/sh ./foo.shতবে তা ঠিক আছে।

আমি কীভাবে এটি ঠিক করতে পারি যাতে আমি কেবল চালাতে পারি ./foo.shএবং এটি স্বয়ংক্রিয়ভাবে এটিকে / বিন / শ দিয়ে চালায়?

সম্পাদনা: ঠিক আছে, এটি ক্রোম ওএস এবং এই নির্দিষ্ট ফোল্ডারটি মাউন্ট করা হয়েছে noexec। স্পষ্টতই যে কেবল চালানোর ক্ষমতাটিকে ব্যর্থ করে ./foo.sh; তবে কেন? আমি এখনও কেন sh foo.shএকই জিনিস অর্জন করতে দৌড়াতে পারি ? তাহলে কি সুরক্ষা দেয় noexec?


1
অস্পষ্টতার মাধ্যমে সুরক্ষা
মাইকেল ডুরান্ট

"। Foo.sh" কাজ করে কি আপনি চেষ্টা করেছেন?
ড্যানিয়েল টেস্টা 26'19

@ ড্যানিয়েলটেষ্টা এই প্রশ্নটি অনেক আগে থেকেই একটি প্রাচীন প্রতীক। আমি প্রথম ক্রোমবুকগুলির মধ্যে একটি গুগল সিআর -৮৮ ব্যবহার করছিলাম, ChromeOS- এর একটি প্রারম্ভিক (তবে স্থিতিশীল) সংস্করণটি চালাচ্ছি। তার পর থেকে আমরা দীর্ঘ পথ পেরিয়ে এসেছি এবং আমি মনে করি না যে এই প্রশ্নটি সর্বশেষতম ChromeOS সংস্করণে প্রযোজ্য হবে, তবে আমি এটি নিশ্চিতভাবে বলার জন্য ব্যবহার করি নি। যাইহোক আমি মনে করি আপনার প্রকরণটিও কাজ করতে পারে তবে নিশ্চিতভাবে বলার আগে এটির পরীক্ষা করা উচিত। এর যাদুটি ঠিক কীভাবে noexecকাজ করে তা সম্পর্কে আমি এখনও অস্পষ্ট ।
রিকিট

উত্তর:


22

noexecপতাকা উপযুক্তভাবে স্ক্রিপ্ট ক্ষেত্রে প্রযোজ্য কারণ যে "প্রত্যাশিত" আচরণ কেমন হওয়া উচিৎ হবে না।

যাইহোক, সেটিং noexecকেবলমাত্র এমন লোকদের থামিয়ে দেয় যাঁরা কী করছেন তা সম্পর্কে যথেষ্ট জানেন না। আপনি যখন চালনা করেন sh foo.shআপনি আসলে shতার ডিফল্ট অবস্থান (সম্ভবত /bin) থেকে চালাচ্ছেন যা মাউন্ট করা কোনও ফাইল সিস্টেমে নেই noexec

এমনকি সরাসরি অনুরোধ noexecকরে আপনি নিয়মিত বাইনারি ফাইলগুলির সন্ধান করতে পারেন ld

cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash

এটি ব্যাশ চালাবে, এটি মাউন্ট করা কোনও ফাইল সিস্টেমে রয়েছে কিনা তা নির্বিশেষে noexec


5
উল্লেখ করার জন্য +1 ld.so(চতুর)
অ্যামফেটামাইচিন

আমি আপনার দুটি আদেশ চেষ্টা করেছিলাম; "ভাগ করা অবজেক্ট ফাইলটি খুলতে পারে না: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই" - sh কপি হওয়ার কারণে বাশ চালানো হচ্ছে। আমি তখন আমি চেষ্টা /lib/ld-2.10.1.so $HOME/shএবং এটি অন্য ত্রুটি ফিরিয়ে লোড হওয়ার সময় লাইব্রেরি ভাগ করেছে: /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted। আমি নিশ্চিত নই যে আপনি যা বলেছেন তা অসত্য ছিল, বা অন্য কোনও কিছু যদি হস্তক্ষেপ করছে। উদাহরণস্বরূপ, / কেবল পঠনযোগ্য হিসাবে মাউন্ট করা হয়।
রিকিট

ভাল, আমি নির্দিষ্ট করে বলতে পারি না কারণ আমার কাছে চেষ্টা করার জন্য ChromeOS এর একটি অনুলিপি নেই। আমি পুরোপুরি আত্মবিশ্বাসী যে এটি কিছু সংশোধন নিয়ে কাজ করতে পারে তবে নিজে চেষ্টা করে দেখতে না পারার কারণ আমি জানি না।
বাহামত

ওহ ভাল, আমি এটি ভাবতে চাই কারণ Chrome OS সঠিকভাবে লক হয়ে গেছে। এটি বেশ সুরক্ষিত বলে মনে হচ্ছে তবে আমি অনুমান করি যে আমরা সময়ের সাথে এটি দেখতে পাব!
রিকিট

1
ldএবং মধ্যে পার্থক্য আছে ld.soldকম্পাইল করার সময় বাইনারি গঠনের জন্য অবজেক্ট কোডের লিঙ্কিংয়ে ব্যবহৃত লিংকার, অন্যদিকে ld.soপ্রোগ্রাম চালানোর সময় রান-টাইম লিঙ্কার একই ধরণের ক্রিয়াকলাপ সম্পাদন করে। এখানে লিঙ্কার উল্লেখ করা হচ্ছে রান-টাইম লিঙ্কার।
কুসালানন্দ

5

আপনি যদি এমএস-ডস 2-বাইট (ক্যারেজ-রিটার্ন লাইনফিড) লাইন শেষের সাথে কোনও ফাইল চালানোর চেষ্টা করেন তবে আপনি এই ত্রুটিটি (বা খুব খুব অনুরূপ একটি বার্তা )ও পেতে পারেন।

ভিম আজকাল এত স্মার্ট, এটি আপনাকে বাহ্যিকভাবে '^ এম' হিসাবে দেখায় না। সুতরাং ভিম "ফাইল ফর্ম্যাট" কী মনে করে তা পরীক্ষা না করে এবং অন-স্ক্রিন-উপস্থিতিতে নির্ভর করে যদি আপনি বোকা হয়ে যেতে পারেন।

এই ক্ষেত্রে "#! / Bin / sh ^ M" কার্নেলকে "/ bin / sh ^ M" সন্ধানের চেষ্টা করে, যা এটি করতে পারে না। খারাপ দোভাষী, সত্যই।


2

আপনার যদি কোনও ইউএসবি স্টিক (বা অন্যান্য অপসারণযোগ্য মিডিয়া) থেকে স্ক্রিপ্ট বা প্রোগ্রাম চালনার বিকল্প থাকে, আপনি আনমাউন্টিং এবং ম্যানুয়ালি এটি পুনরায় মাউন্ট করার চেষ্টা করতে পারেন:

  1. ইউএসবি স্টিক প্লাগ করুন

  2. এর সাথে ইউএসবি স্টিক ডিভাইস সন্ধান করুন $ mount

  3. এটি খেয়াল করুন; আসুন ধরে নিই/dev/sdb1

  4. আনমাউন্ট ইউএসবি স্টিক:

    $ cd /media/removable
    
    $ sudo umount mountpoint

শেষ পর্যন্ত, ইউএসবি স্টিকটি পুনরায় মাউন্ট করুন:

$ sudo mount /dev/sdb1 mountpoint

মাউন্টপয়েন্ট সহ ইউএসবি স্টিকের মাউন্ট নাম


1

ChromeOS / ChromiumOS- এ সিস্টেম সুরক্ষার কারণে কিছু নির্দিষ্ট ফোল্ডার চিহ্নিত করা হয়েছে noexecএবং আপনাকে নীচের কমান্ডটি দিয়ে পুনরায় মাউন্ট করতে হবে, অথবা noexecদ্বিতীয় উদাহরণের মতো সেট করা হয়নি এমন বিকল্প পথ ব্যবহার করতে হবে ।

এই কমান্ডগুলি ধরে নিয়েছে যে আপনি কমপক্ষে বিকাশকারী মোডে রয়েছেন এবং এর shellসাথে অ্যাক্সেস করেছেন chronos@localhost / $কেবলমাত্র নয় crosh>এবং সুডো পাসওয়ার্ডটিও জানেন know

sudo mount -i -o remount,exec /home/chronos/user/

আরও বেশি টেকসই পদ্ধতি যা আপগ্রেডে টিকে থাকতে হবে কারণ গুগল /usr/localবিকাশকারীদের জন্য বেশিরভাগ সংরক্ষণ করে :

sudo mkdir -p /usr/local/bin/ && sudo chown -R chronos: /usr/local/bin/
cp ${HOME}/Downloads/foo.sh /usr/local/bin/

জিনিসগুলি এখানে রাখার অতিরিক্ত সুবিধা হ'ল এটি $PATHইতিমধ্যে রয়েছে ( echo $PATHএটি নিশ্চিত করার চেষ্টা করুন) সুতরাং আপনার যে স্ক্রিপ্টগুলি বা বাইনারি রয়েছে সেগুলি চালানোর জন্য আপনার পুরো পথটি ব্যবহার করার দরকার নেই /usr/local/binএবং chmod +xসেগুলি চালিত হয়েছে।


2
হাই, ইউনিক্স এসই তে স্বাগতম! দ্রষ্টব্য, একক-আদেশের উত্তরগুলি এখানে খুব বেশি সদর দফতর হিসাবে বিবেচিত হয় না। আমি ব্যাখ্যা করার পরামর্শ দিচ্ছি, আপনি কী করছেন এবং কেন করছেন।
পিটারহ - মনিকা পুনরায় ইনস্টল করুন

0

আমিও একই প্রশ্ন করেছিলাম. আমার সমস্যাটি ছিল এসডি কার্ড নিয়ে। এটি আমার পক্ষে কাজ করেছিল এবং এটি এখানে অন্যান্য উত্তরগুলির চেয়ে অনেক সহজ। আমি ক্রাউটন ইস্যু # 928 থেকে এটি শিখেছি ।

$ sudo mount -o remount,exec /media/removable/SD\ Card

মনে রাখবেন যে আপনাকে ডিভাইসটি (/ dev / mmcblk1p1) নয়, মাউন্ট পয়েন্ট ব্যবহার করতে হবে। আপনার ক্ষেত্রে ইউএসবি (/ dev / sdb1) এর জন্য একই জিনিস। শুধুমাত্র মাউন্ট পয়েন্ট পৃথক:

$ sudo mount -o remount,exec /media/removable/USB\ Drive

আপনি জানতে পারবেন এটির কাঙ্ক্ষিত প্রভাব ছিল কারণ যখন আপনি জিজ্ঞাসা করবেন তখন "noexec" মাউন্ট বিকল্পগুলি থেকে অদৃশ্য হয়ে যাবে।

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