bash: / dev / stderr: অনুমতি অস্বীকার করা হয়েছে


19

একটি নতুন রিলিজ সংস্করণে আপগ্রেড করার পরে, আমার bashস্ক্রিপ্টগুলিতে থুতু ত্রুটি শুরু হয়:

bash: /dev/stderr: Permission denied

পূর্ববর্তী সংস্করণে উপস্থিত ব্যাশ হবে অভ্যন্তরীণভাবে চিনতে ঐ ফাইলের নাম (যে কারণে এই প্রশ্নের সদৃশ নয় এই এক ) এবং ডান জিনিস (TM) না যাইহোক, এই এখন কাজ বন্ধ করে দিয়েছে। আমার স্ক্রিপ্টগুলি আবার সফলভাবে চালাতে সক্ষম হতে আমি কী করতে পারি?

আমি স্ক্রিপ্টটি চালাচ্ছে ব্যবহারকারীকে এই গোষ্ঠীতে যুক্ত করার চেষ্টা করেছি tty, তবে এটি কোনও পার্থক্য করে না (এমনকি লগ আউট এবং ফিরে আসার পরেও)।

আমি সমস্যা ছাড়াই কমান্ড লাইনে এটি পুনরুত্পাদন করতে পারি:

$ echo test > /dev/stdout
bash: /dev/stdout: Permission denied
$ echo test > /dev/stderr
bash: /dev/stderr: Permission denied
$ ls -l /dev/stdout /dev/stderr
lrwxrwxrwx 1 root root 15 May 13 02:04 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 May 13 02:04 /dev/stdout -> /proc/self/fd/1
$ ls -lL /dev/stdout /dev/stderr
crw--w---- 1 username tty 136, 1 May 13 05:01 /dev/stderr
crw--w---- 1 username tty 136, 1 May 13 05:01 /dev/stdout
$ echo $BASH_VERSION
4.2.24(1)-release

পুরানো সিস্টেমে (উবুন্টু 10.04):

$ echo $BASH_VERSION
4.1.5(1)-release

1
এর আউটপুট কী ls -l /dev/stdout /dev/stderrএবং ls -lL /dev/stdout /dev/stderr?
কিথ থম্পসন

@ কিথ: আমার সম্পাদিত প্রশ্ন দেখুন। এর অর্থ কি বাশ এর অভ্যন্তরীণ হ্যান্ডলিংটিকে পুরোপুরি ত্যাগ করেছে? পুরানো সিস্টেমে এই চিহ্নগুলি বিদ্যমান ছিল না এবং এখনও কোডটি সমস্যা ছাড়াই কাজ করেছে। দ্রষ্টব্য, এটি ছদ্মবেশে চলছে sudo su username2 -...
0xC0000022L

আপনি কোন বাশ সংস্করণ ব্যবহার করছেন? echo $BASH_VERSION
জিপ্পি

1
পুরানো এবং নতুন সংস্করণগুলি কী কী (আপনার ওএস এবং ব্যাশের আগে এবং পরে?
কেথ থম্পসন

উত্তর:


41

আমি মনে করি না এটি পুরোপুরি বাশার সমস্যা।

একটি মন্তব্যে, আপনি বলেছিলেন যে আপনি করার পরে এই ত্রুটিটি দেখেছেন

sudo su username2

হিসাবে লগ ইন যখন username। এটা suযে সমস্যা triggering হচ্ছে।

/dev/stdoutকরার জন্য একটি সিমবলিক লিঙ্ক হয় /proc/self/fd/1, যা করার জন্য একটি সিমবলিক লিঙ্ক, উদাহরণস্বরূপ হয়, /dev/pts/1/dev/pts/1, যা সিউডোটার্মিনাল, এর মালিকানাধীন, এবং এর দ্বারা লিখিত username; usernameলগ ইন করার সময় সেই মালিকানা মঞ্জুর করা হয়েছিল When আপনি যখন sudo su username2, এর মালিকানা /dev/pts/1পরিবর্তন হয় না, এবং username2লেখার অনুমতি নেই।

আমি তর্ক করব যে এটি একটি বাগ is প্রকৃতপক্ষে স্ট্যান্ডার্ড আউটপুট প্রবাহের জন্য একটি উপনাম /dev/stdout হওয়া উচিত তবে এখানে আমরা এমন একটি পরিস্থিতি দেখি যেখানে echo helloকাজ করে তবে echo hello > /dev/stdoutব্যর্থ হয়।

একটি কর্মসূচী username2গ্রুপের সদস্য করা হবে tty, তবে এটি যে কোনও টিটি-র username2কাছে লেখার অনুমতি দেবে , যা সম্ভবত অনাকাঙ্ক্ষিত।

আর একটি কাজ হ'ল username2ব্যবহার না করে অ্যাকাউন্টে লগইন করা su, যাতে /dev/stdoutমালিকানাধীন নতুন বরাদ্দকৃত সিউডোটার্মিনালটিকে নির্দেশ করে username2। এটি ব্যবহারিক হতে পারে না।

আর একটি কাজ হ'ল আপনার স্ক্রিপ্টগুলি সংশোধন করা যাতে তারা উল্লেখ করে না /dev/stdoutএবং /dev/stderr; উদাহরণস্বরূপ, এটি প্রতিস্থাপন করুন:

echo OUT > /dev/stdout
echo ERR > /dev/stderr

এটা দ্বারা:

echo OUT
echo ERR 1>&2

আমি আমার নিজের সিস্টেম, উবুন্টু 12.04 তে এটিকে দেখতে ব্যাশ 4.2.24 সঙ্গে, - যদিও ব্যাশ দস্তাবেজ ( info bash) আমার সিস্টেমে বলে /dev/stdoutএবং /dev/stderrযখন পুনঃনির্দেশগুলি ব্যবহৃত বিশেষভাবে চিকিত্সা করা হয়। তবে যদিও বাশ সেই নামগুলি বিশেষভাবে ব্যবহার করে না, তবুও তাদের স্ট্যান্ডার্ড I / O স্ট্রিমগুলির সমপরিমাণ হিসাবে কাজ করা উচিত। (পসিক্স উল্লেখ করেনি /dev/std{in,out,err}, সুতরাং এটি ত্রুটিযুক্ত যে তর্ক করা কঠিন হতে পারে))

বাশের পুরানো সংস্করণগুলির দিকে তাকানো, ডকুমেন্টেশনের মাধ্যমে বোঝা যায় যে /dev/stdoutফাইলগুলির অস্তিত্ব আছে বা না থাকায় এট আলকে বিশেষভাবে চিকিত্সা করা হয়। বৈশিষ্ট্যটি ব্যাশ ২.০৪ এ প্রবর্তিত হয়েছিল এবং NEWSসংস্করণটির ফাইলটি বলে:

পুনঃনির্দেশ কোডটি এখন বেশ কয়েকটি ফাইলের নাম বিশেষত: / dev / fd / N, / dev / stdin, / dev / stdout, এবং / dev / stderr পরিচালনা করে, তারা ফাইল সিস্টেমে উপস্থিত রয়েছে কি না।

তবে আপনি যদি সোর্স কোডটি পরীক্ষা করেন ( redir.c), আপনি দেখতে পাবেন যে সেই বিশেষ হ্যান্ডলিংটি কেবলমাত্র প্রতীকটি HAVE_DEV_STDINসংজ্ঞায়িত হলেই সক্ষম হয় (বাশ উত্স থেকে তৈরি হওয়ার সময় এটি নির্ধারিত হয়)।

আমি যতদূর বলতে পারি, বাশের কোনও প্রকাশিত সংস্করণ /dev/stdoutএট- অ- শর্তহীন শর্তাবলীর বিশেষ পরিচালন করতে পারে নি - যদি না কিছু বিতরণ প্যাচ করে।

সুতরাং আর একটি কার্যনির্বাহী (যা আমি চেষ্টা করিনি) হ'ল বাশ উত্সগুলি দখল করা , redir.cবিশেষ /dev/*হ্যান্ডলিংকে নিঃশর্ত করার জন্য পরিবর্তন করা এবং আপনার সিস্টেমে আসা সংস্করণটির পরিবর্তে আপনার পুনর্নির্মাণ সংস্করণটি ব্যবহার করা। যদিও এটি সম্ভবত ওভারকিল।

সারসংক্ষেপ :

আপনার OS আমার মত, মালিকানা ও অনুমতি হ্যান্ডলিং করা হয় না /dev/stdoutএবং /dev/stderrসঠিকভাবে। বাশ সম্ভবত এই নামগুলি পুনর্নির্দেশগুলিতে বিশেষভাবে বিবেচনা করে তবে বাস্তবে এটি ফাইলগুলির অস্তিত্ব না থাকলে তা করে। যে বিষয়টি না যদি /dev/stdoutএবং /dev/stderrসঠিকভাবে কাজ করেন। আপনি যখন suঅন্য অ্যাকাউন্টে যান বা অনুরূপ কিছু করেন কেবল তখনই এই সমস্যাটি দেখা যায় ; আপনি যদি কেবল কোনও অ্যাকাউন্টে লগইন করেন তবে অনুমতিগুলি সঠিক।


টিটিওয়াইয়ের মালিকানা পরিবর্তন করা উচিত। এটিই কনসোলকিট (ওরফে pam_ck_connector.soহ'ল)।
মিকেল 13'12

আসলে, আমি ভুল হতে পারে। আরও খনন করতে হবে।
মাইকেল

আমার সিস্টেমে /proc/self/fd/1এর অনুমতিগুলি আপডেট হচ্ছে, তবে এটি অর্থহীন, যেহেতু এটি একটি সিমিলিংক। ফেডোরায়ও ঘটে যা কনসোলকিটকে বাতিল বলে মনে হচ্ছে।
মাইকেল

1

প্রকৃতপক্ষে এর কারণ হ'ল udev বিশেষত tty ডিভাইসে 0620 এ অনুমতি নির্ধারণ করে এবং su এর মালিকানা বা অনুমতিগুলি পরিবর্তন করে না এবং তাও করা উচিত নয়। আমার দৃষ্টিতে এটি আমাদেরকে এমন একটি পরিস্থিতিতে ফেলে দেয় যা / dev / std * অ-বহনযোগ্য করে তোলে।

এর সহজ সমাধানটি হ'ল "মেসজি ওয়াই" কে / ইত্যাদি / প্রোফাইলে (বা আপনি যে শীর্ষ স্তরের প্রোফাইল ব্যবহার করতে চান) এটি আপনার টিটি ডিভাইসের অনুমতিগুলি 0622 এ পরিবর্তন করে I আমি আসলে এটি পছন্দ করি না তবে এটি সম্ভবত আরও ভাল ওদেব নিয়মের পরিবর্তনের চেয়ে।


"msg y" কাজ করে না
লুসিওানো

অপেক্ষা করুন ... সম্ভবত বাশের জন্য অনুসন্ধানগুলি বিশেষত যখন ফাইলের ম্যান পৃষ্ঠাতে পুনর্নির্দেশে ব্যবহৃত হয় তখন বেশ কয়েকটি ফাইলের নাম পরিচালনা করে
0xC0000022L

0

দীর্ঘদিন লিনাক্স ব্যবহারকারী হিসাবে আমি সম্প্রতি একটি নতুন উবুন্টু bit৪ বিট 12.04 এলটিএস সিস্টেম স্থাপন করেছি এবং আমার বাশ স্ক্রিপ্টগুলি কেন কাজ করছে না - এটি অস্বীকার করা হয়েছিল - এবং পরে আমি এই থ্রেডটি পেয়েছি। আমি ভেবেছিলাম নতুন ওএসের কিছু কারণে সমস্যা হতে পারে।

শেষ পর্যন্ত দেখা যাচ্ছে যে আমি বেকুবভাবে আমার /homeডিরেক্টরিতে অনুমতি সেট করতে একটি ইউআই সরঞ্জাম ব্যবহার করেছি এবং সমস্যাটি ড্রাইভ- সম্পর্কিত ছিল । নিশ্চিত হওয়ার জন্য, আমি একটি tempডিরেক্টরি তৈরি করেছিলাম /optএবং আমার স্ক্রিপ্টগুলি সেখান থেকে ঠিকঠাক চলতে পারে। একবার আমি /homeড্রাইভের অনুমতিগুলি স্থির করে নিলে সবকিছু স্বাভাবিক হয়ে যায়।

একটি ছোট রহস্য সমাধান করা। দীর্ঘশ্বাস


2
এটি অবশ্যই একটি পৃথক ত্রুটি হয়েছে। / বাড়িতে কোনও কিছু সংশোধন করা / দেবকে প্রভাবিত করে না।
ott--

-1

এটি একটি পুরানো প্রশ্ন, তবে আমি এখনও খুব প্রাসঙ্গিক বলে মনে করি, অতএব এখানে এমন সমাধান আমি পেয়েছি যা এখানে উল্লেখ করা হয়নি।

আমি এই প্রশ্নটি জুড়ে এসেছি কারণ আমি একটি 'সু' স্যুইচড অ্যাকাউন্ট এক্সিকিউটিভ কমান্ডের ক্ষেত্রেও ব্যাশটিতে এই বিষয়গুলি দেখেছি:

echo test > /dev/stderr

যেহেতু আমি যা করার চেষ্টা করছি সমস্তই স্টডআউটকে স্ট্যাডারে পুনঃনির্দেশিত করা হয়, নীচেরগুলি একই অর্জন করে এবং এটি 'সু' স্যুইচড অ্যাকাউন্টেও কাজ করে:

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