আপনার লেখার অনুমতি নেই এমন কোনও ফাইলে স্টাডাউটকে পুনঃনির্দেশ করা হচ্ছে


113

আপনি যখন কোনও ফাইলের লেখার অনুমতি ছাড়াই এটি পরিবর্তন করার চেষ্টা করেন, আপনি একটি ত্রুটি পান:

> touch /tmp/foo && sudo chown root /tmp/foo
> echo test > /tmp/foo
zsh: permission denied: /tmp/foo

Sudoing সাহায্য করে না, কারণ এটি কমান্ডটি রুট হিসাবে চালায়, তবে শেলটি পুনর্নির্দেশ stdout পরিচালনা করে এবং যাইহোক ফাইলটি আপনাকে যেমন খোলে:

> sudo echo test > /tmp/foo
zsh: permission denied: /tmp/foo

রুট হিসাবে শেল খোলা এবং ফাইলটি সেভাবে চালিত করা ছাড়াও আপনার লেখার অনুমতি নেই এমন কোনও ফাইলে স্টডআউটকে পুনঃনির্দেশ করার সহজ উপায় কি আছে?

> sudo su
# echo test > /tmp/foo

2
Stackoverflow থেকে একটি অনুরূপ প্রশ্নের জন্য উত্তর stackoverflow.com/questions/82256/...
ক্রিস্টিয়ান Ciupitu

আপনি নিজেকে tmp এ তৈরি করেছেন এমন কোনও ফাইলের অনুমতি কীভাবে পাবেন না? এটা কি উমাস্কের কারণে?
k961

@ k961 আমি chownমালিক পরিবর্তন করতাম ; এটি কেবল একটি উদাহরণ ছিল
মাইকেল মরোজেক

উত্তর:


116

হ্যাঁ, ব্যবহার করছি tee। তাই echo test > /tmp/fooহয়ে যায়

echo test | sudo tee /tmp/foo

আপনি সংযোজন করতে পারেন ( >>)

echo test | sudo tee -a /tmp/foo

27
টিও স্টাডাউট আউটপুট হবে; কখনও কখনও আপনি পর্দা ভরাট সামগ্রী চান না। এটি ঠিক করার জন্য, করুনecho test | sudo tee /tmp/foo > /dev/null
শন জে গফ

হেরডোক দিয়ে কীভাবে করবেন?
জনডোইয়া

26

echo( >শেল পুনর্নির্দেশ অপারেটরের মতো) আউটপুট দিয়ে ফাইলের সামগ্রীটি প্রতিস্থাপন করতে ।

echo test | sudo dd of=/tmp/foo

seekকাটা ছাড়াই ( শুরুতে 1<>বোর্ন শেল অপারেটরের মতো) ফাইলে লিখতে (যদিও আপনি বিভিন্ন অফসেটে আউটপুট ব্যবহার করতে পারেন ):

echo test | sudo dd of=/tmp/foo conv=notrunc

>>জিএনইউ সহ ফাইলটিতে (যেমন ) যুক্ত হতে dd:

echo test | sudo dd of=/tmp/foo oflag=append conv=notrunc

আরও দেখুন গনুহ ddএর conv=exclএকটি বিদ্যমান ফাইল (মতো clobbering এড়াতে set -o noclobberPOSIX শাঁস) ও conv=nocreatবিপরীত জন্য (শুধুমাত্র একটি বিদ্যমান ফাইল আপডেট)।


চালাক! echo test | sudo tee /tmp/foo >/dev/nullএটি আউটপুট বাতিল করার জন্য প্রয়োজনীয়তা হ্রাস করে ।
অ্যাডাম কাটজ

2
আমি এটি ফিরে নিতে হতে পারে; আপনি যদি অস্পষ্ট GNU- শুধুমাত্র বিকল্পগুলি ব্যবহার না করেন তবে এটি এই উত্তরটির কমনীয়তা সরিয়ে না ddদেয় তবে তার জন্য এটি অবিশ্বস্তiflag=fullblock oflag=fullblock । আমি সাথে থাকব tee
অ্যাডাম কাটজ 16'15

5
অ-অস্পষ্ট বিএস = 1
ডিএম

2
@umeboshi তবে নির্ভরযোগ্য যদি আপনি ঠিক কী কাজ করছেন তা জানতে যথেষ্ট অভিজ্ঞ হন। কারণ ddমোটামুটি বিপজ্জনক হতে পারে (যদি না বলা হয়: ধ্বংসাত্মক) তবে যদি সামান্য ভুল করা হয় mistake সুতরাং নতুন ব্যবহারকারীদের জন্য, আমি বরং teeপদ্ধতিটি নিরাপদ উপকূলে থাকার পরামর্শ দিই ।
সিনট্যাক্সারর

1
@ অ্যাডাম ক্যাটজ, dd of=fileএকা ক্ষেত্রে ( count/ / ছাড়াই skip) এটি নির্ভরযোগ্য। iflag=fullblockপ্রয়োজন হয় না কারণ এখানে ddইনপুটটিতে যা পড়ে তা আউটপুটে লেখেন। এটি পুরো ব্লক না থাকলে কিছু যায় আসে না।
স্টাফেন চেজেলাস

12

tee সম্ভবত সেরা পছন্দ, তবে আপনার পরিস্থিতির উপর নির্ভর করে এর মতো কিছু যথেষ্ট হতে পারে:

sudo sh -c 'echo test > /tmp/foo'

1
3 সমস্যা: evalএকটি সরল পরিবর্তে sh -c; -i, যা আপনার কাজের dir পরিবর্তন করবে; পুরো কমান্ডটিকে রুট হিসাবে চালানো, যা এর আচরণ পরিবর্তন করতে পারে বা একটি অপ্রয়োজনীয় ঝুঁকি প্রবর্তন করতে পারে। কেন এটি কখনও উত্সাহ পেল?

4
আপনি করেন নি, তবে এটি বিভ্রান্তিকর, সাধারণত খারাপ এবং এমনকি বিপজ্জনক।

5

আমি সম্মত | sudo teeহওয়ার পরেও এটাই মূল উপায়, কখনও কখনও সেড (এখানে জিএনইউ ধরে নেওয়া sed) কাজ করতে পারে:

cat sudotest 
line 1

sudo sed -i '1iitest' sudotest && cat sudotest 
itest
line 1

sudo sed -i '$aatest' sudotest && cat sudotest 
itest
line 1
atest

-iজায়গায় জায়গায় ফাইল পরিবর্তন করে। 1iমানে সন্নিবেশ লাইন সামনে 1. $aউপায়ে সংযোজন শেষ লাইনটি পরে।

বা এক্সক্লিপবোর্ডে অনুলিপি করুন:

somecommand | xclip
sudo gedit sudotest
move cursor to desired place, click middle mouse button to insert, save

1
এটি প্রাচীন চীনা ধাঁধার মতো শব্দযুক্ত। এটি এত উপায়ে কীভাবে পেল তা বোঝার জন্য দেখতে পাচ্ছি না। ( hrmph )
সিনট্যাক্সারর

1
@ সাইন্ট্যাক্সেরর: স্যার, আমি দুঃখিত, আমি স্থানীয় নেটিভ স্পিকার নই। আপনার কাছে যা অস্পষ্ট তা যদি আপনি নির্দিষ্ট করে থাকেন তবে আমি আমার উত্তরটি উন্নত করার চেষ্টা করতে পারি। গার্টের v৫ টি উপভোগের সাথে তুলনা করা, 4 টি এমন অনেকগুলি উর্ধ্বতন বলে মনে হচ্ছে না হয়, আপনিও ভাবেন না?
ব্যবহারকারী অজ্ঞাত

ভাল আমি 4 :-D এর সাথে খুব সন্তুষ্ট হব আপনার ইংরেজি মোটেই খারাপ নয়। এটি কেবল এক ধরণের টর্স টেকি নার্ডস্পিকের সাথে কথিত। আমি অবশ্যই আপনাকে কোডার বলে অনুমান করতে পারি। একে অপরের মধ্যে কোডাররা সেভাবে নিজেকে পুরোপুরি বুঝতে পারবে, তবে একটি নন-কোডার অবশ্যই মনে করবে এটি যেমন বলা হয়েছে ... যেমন বলা হয়েছে।
সিনট্যাক্সেরর

নোট যে sed -iফাইলটি আসলে জায়গায় সংশোধন করে না - এটি একটি অস্থায়ী ফাইল তৈরি করে এবং প্রস্থান করার সময় এটির নামকরণ করে। সুতরাং আপনি tail -f ...আসল ফাইলের মতো কিছু করতে সক্ষম হবেন না এবং sed -i ...পাইপলাইন চলাকালীন ব্যবহার করে আউটপুটটি দেখতে পাবেন
অ্যান্ড্রু হেনেল

@ অ্যান্ড্রুহেনেল: হ্যাঁ, যেহেতু আকারটি বাড়ানো বা সঙ্কুচিত করা যেতে পারে এবং যেহেতু এটি বেশিরভাগ চালকের অনুরোধের ক্ষেত্রেই হতে পারে, এবং আপনি এমনকি আফিকও পারবেন না - এসএসডি তে একই জায়গায় লিখুন এটি কেবলমাত্র 'ছদ্মবেশে' অপারেশন। । একজন নেটিভ ইংলিশ স্পিকার হিসাবে, আমি কি একটি সংক্ষিপ্ত ভাবের জন্য জিজ্ঞাসা করতে পারি, যা সম্ভবত ভুল ব্যাখ্যা করা হয়নি? শুধু -i creates a new file of same nameবা আরও কিছু কমপ্যাক্ট আছে? আমার ধারণা আমি পছন্দ করি in placeকারণ এটি ব্যাখ্যা করে i। Gnu-sed ম্যানপেজটি এটিকেও জায়গায় কল করে এবং দীর্ঘ পতাকাটি --in-place
ব্যবহারকারী অজানা

2

আমি একই ধরণের সমস্যার জন্য আমার মনের ধারণাগুলির পিছনে লাথি মারছি এবং নিম্নলিখিত সমাধানগুলি নিয়ে এসেছি:

  • sudo uncatuncatএমন একটি প্রোগ্রাম যেখানে স্ট্যান্ডার্ড ইনপুট পড়ে এবং কমান্ড লাইনে থাকা ফাইলটিতে এটি লিখে, তবে আমি uncatএখনও লিখিনি।

  • sudocatযে রূপটি sudoeditআমি এখনও লিখিনি যে এটি একটি ক্লিনার sudo catবা sudo uncat

  • অথবা sudoeditএকটি সম্পাদকের সাহায্যে এই ছোট কৌশলটি যা শেল স্ক্রিপ্ট

    #!/bin/sh
    # uncat
    cat > "$1"

    যা হয় হিসাবে |sudo ./uncat fileবা হিসাবে আহ্বান করা যেতে পারে | EDITOR=./uncat sudoeditযে আকর্ষণীয় পার্শ্ব প্রতিক্রিয়া আছে।


catকন বিড়াল inate ফাইল ফাইলের একটি তালিকা নেয় , সুতরাং uncat ফাইল থেকে একটি কন বিড়াল inate ফাইলের একটি তালিকা নিতে হবে। প্রতিটি ফাইলের মধ্যে কত পরিমাণ রাখা উচিত তা স্থির করতে ম্যাজিক ব্যবহার করতে হবে। বিকল্প নাম অন্তর্ভুক্ত dog, to-file, redirect
ctrl-alt-delor

আমি uncatযখন থাকব তখন কেন চাইব তার কোনও কারণ আমি ভাবতে পারি না tee
ওয়াইল্ডকার্ড

1
ঠিক teeআছে, তুচ্ছ ত্রুটি আছে যে এটি তার স্ট্যান্ডকে তার স্টিন লেখেন - যা স্টাডাউটকে পুনর্নির্দেশের মাধ্যমে তুচ্ছভাবে প্রশমিত করা হয় /dev/null। অন্যান্য বিকল্প অন্তর্ভুক্ত dd of=/tmp/foo(অন্য উত্তর উল্লেখিত), যা stderr হবে স্থিতির তথ্য লিখেছেন, এবং cp /dev/stdin /tmp/foo
স্কট

1

Moreutils প্যাকেজ থেকে স্পঞ্জ ব্যবহার করুন। এটি সুবিধা যে এটি stdout লিখেন না।

echo test | sudo sponge /tmp/foo

ওভাররাইট করার পরিবর্তে কোনও ফাইল যুক্ত করতে -a বিকল্পটি ব্যবহার করুন।


1
আমি নিশ্চিত না স্টাডাউট উপহারগুলিতে কী সুবিধা লিখছি না, তবে আপনি /dev/nullযদি কোনও সমস্যা হয়ে থাকেন তবে আউটপুটটি পুনঃনির্দেশ করতে পারেন
মাইকেল মরোজেক

1
অবশ্যই আমি / dev / null এ পুনঃনির্দেশ করতে পারি তবে কমান্ডটি পুনর্নির্দেশ ছাড়াই পাঠ করা এবং টাইপ করা সহজ। স্টাডাউটকে না লেখার সুবিধাটি হ'ল আমার টার্মিনালটি আবর্জনায় ভরাট নয়।
হন্টভেরি লেভেন্তে

1
পুনঃনির্দেশকে ছাড়িয়ে দেওয়ার জন্য আমি কোনও প্যাকেজ ইনস্টল করব না, তবে আমি নিয়মিত স্পঞ্জ ব্যবহার করি, তাই এটি ইতিমধ্যে রয়েছে।
হন্টভেরি লেভেন্তে

0

ত্রুটিটি ক্রমটি যে ক্রমে কাজ করে সে থেকে আসে।

পুনঃনির্দেশটি শেল এমনকি কার্যকর করার আগে হ্যান্ডেল sudoকরা হয় এবং সুতরাং আপনি বর্তমানে যেমন ব্যবহার করছেন তার ব্যবহারকারীর অনুমতি নিয়ে সম্পন্ন হয়। যেহেতু আপনার কাছে পুনঃনির্দেশের লক্ষ্য তৈরি / কাটা লেখার অনুমতি নেই, তাই আপনি permission deniedশেল থেকে একটি ত্রুটি পান।

সমাধানটি গ্যারান্টি দেয় যে আউটপুট ফাইলটি আপনাকে প্রদত্ত পরিচয়ের আওতায় তৈরি করা হয়েছে sudo, যেমন tee:

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