আমার কাছে লেখার অনুমতি নেই এমন স্থানে আউটপুট পুনর্নির্দেশের জন্য আমি কীভাবে sudo ব্যবহার করব?


880

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

সমস্যাটি হচ্ছে, এই নিখুঁত উদাহরণটি কাজ করে না:

sudo ls -hal /root/ > /root/test.out

আমি কেবল প্রতিক্রিয়া পেয়েছি:

-bash: /root/test.out: Permission denied

আমি কীভাবে এটি কাজ করতে পারি?


1
chmod u + w ফাইলের নাম ব্যবহার করুন
সাজ্জাবলস ডম্বি

@ ডোম্বিস্যাবল্যাকস আপনি পরামর্শ দিচ্ছেন যে আমি প্রথমে সুডো হিসাবে ফাইলটি তৈরি করব, তারপরে নিজেকে অনুমতি দেব? ভাল ধারণা.
জোনাথন

অনেক পরিস্থিতিতে আপনি এখানেই শেষ হয়েছিলেন কারণ আপনি জিজ্ঞাসা করেছিলেন "কেন আমাকে অনুমতি বঞ্চিত করা হয়?" কখনও কখনও উত্তরটি হ'ল আপনাকে কোনও ফাইল তৈরি করতে হবে root(যার ক্ষেত্রে উত্তরগুলি পড়তে হবে) তবে খুব সহজেই আপনাকে নিজের মতো করে অন্য কোথাও ফাইলটি তৈরি করতে হবে।
ট্রিপল

1
এই উত্তরগুলির সাথে লড়াই করার পরে অবশেষে আমি একটি অস্থায়ী ফাইলে পুনর্নির্দেশ করতে এবং sudo এটিকে গন্তব্যে নিয়ে যেতে বেছে নিই।
টিংকুইয়ান এলআই

উত্তর:


1231

আপনার কমান্ড কাজ করে না কারণ আপনার শেল দ্বারা পুনর্নির্দেশটি সম্পাদন করা হয়েছে যার কাছে লেখার অনুমতি নেই /root/test.out। আউটপুটটির পুনর্নির্দেশটি sudo দ্বারা সম্পাদিত হয় না

একাধিক সমাধান রয়েছে:

  • সুডো দিয়ে একটি শেল চালান এবং -cবিকল্পটি ব্যবহার করে এটিতে কমান্ডটি দিন :

    sudo sh -c 'ls -hal /root/ > /root/test.out'
    
  • আপনার কমান্ড সহ একটি স্ক্রিপ্ট তৈরি করুন এবং sudo দিয়ে সেই স্ক্রিপ্টটি চালান:

    #!/bin/sh
    ls -hal /root/ > /root/test.out
    

    চালান sudo ls.sh। আপনি যদি অস্থায়ী ফাইল তৈরি করতে না চান তবে স্টিভ বেনেটের উত্তর দেখুন ।

  • শেল চালু করুন sudo -sতারপরে আপনার কমান্ডগুলি চালান:

    [nobody@so]$ sudo -s
    [root@so]# ls -hal /root/ > /root/test.out
    [root@so]# ^D
    [nobody@so]$
    
  • ব্যবহার করুন sudo tee( -cবিকল্পটি ব্যবহার করার সময় যদি আপনাকে প্রচুর পালাতে হয় ):

    sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
    

    রি স্ক্রিনে আউটপুট থেকে টি/dev/null বন্ধ করতে পুনঃনির্দেশের প্রয়োজন । আউটপুট ফাইল ( ) এর ওভাররাইটের পরিবর্তে সংযোজন করতে , ব্যবহার করুন বা (শেষটি জিএনইউ কোর্টিলগুলির সাথে নির্দিষ্ট )।>>tee -atee --append

দ্বিতীয়, তৃতীয় এবং চতুর্থ সমাধানের জন্য জেডি , অ্যাডাম জে ফারস্টার এবং জনাথনকে ধন্যবাদ।


1
আছে: একটি দুর্দান্ত উত্তর আপনি আলাদাভাবে এখানে stderr এবং stdout- এ পুনর্নির্দেশ কিভাবে বলে এর stackoverflow.com/questions/692000/... ... মূলতperl -e 'print "STDIN\n"; print STDERR "STDERR\n"; ' > >( tee stdout.log ) 2> >( tee stderr.log >&2 )
errant.info

2
শেল্ড আউট কমান্ডের (ভেরিয়েবলের উদাহরণ হিসাবে, কোনও স্ক্রিপ্টে এটি ব্যবহার করার সময়) ভেরিয়েবলগুলি ব্যবহার করার জন্য আপনি 'সুডো-ই ...' করতে চাইবেন।
hiরহীসিদুর

3
টি আউটপুটটিকে / dev / নাল এ পুনঃনির্দেশ করা সম্ভবত অনেক ক্ষেত্রেই প্রয়োজন হয় না যেখানে আউটপুটটিকে স্ক্রিনে প্রতিধ্বনি করা ক্ষতিকারক নয়। উদাহরণস্বরূপ, কেবলমাত্র নিয়মিত কমান্ডগুলি বা ছোট পাঠ্য ফাইলগুলির সামগ্রীর আউটপুট নিয়ে কাজ করার সময়।
থোমাস্রুটার

105

এখানের কেউ সবেমাত্র টি সুদো করার পরামর্শ দিয়েছেন:

sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null

এটি আপনার যে অ্যাক্সেস নেই এমন কোনও ডিরেক্টরিতে কোনও কমান্ড পুনঃনির্দেশ করার জন্যও ব্যবহার করা যেতে পারে। এটি কাজ করে কারণ টি প্রোগ্রাম কার্যকরভাবে একটি "একটি ফাইলের প্রতিধ্বনি" প্রোগ্রাম, এবং / dev / null এ পুনঃনির্দেশ হ'ল এটি উপরের আসল স্বাক্ষরিত উদাহরণের মতোই রাখতে পর্দায় আউটপুট আটকানোও বন্ধ করা।


5
বেশিরভাগ ক্ষেত্রে, যদি সাধারণ ব্যবহারকারীর কমান্ডটি সম্পাদন করার অনুমতি থাকে এবং "কেবল" কাঙ্ক্ষিত আউটপুট ফাইলে লিখতে না পারে তবে প্রথম sudo(যেমন, কমান্ডের জন্যই) বাদ দেওয়া যেতে পারে
Hagen von Eitzen

81

একটি কৌশল যা আমি নিজেই বের করেছিলাম

sudo ls -hal /root/ | sudo dd of=/root/test.out

16
sudo ddsudo tee /root/file > /dev/nullউপরের উদাহরণগুলির চেয়ে ভাল !
ক্রিস্টিয়ানালম

14
ডিডি একটি অদ্ভুত অস্পষ্ট আদেশ নয়। এটি যখনই আপনাকে দুটি ব্লক ডিভাইসের মধ্যে বাফারিং সহ বিপুল পরিমাণে ডেটা অনুলিপি করার প্রয়োজন হয় তখনই এটি ব্যবহৃত হয়। বাক্য গঠনটি আসলে বেশ সহজ, ddকমান্ডের নাম, of=/root/test.outআর্গুমেন্ট যা ddআউটপুট ফাইলগুলি কী তা বলে ।
rhlee

14
@ স্টিভ সমস্ত কিছু 'অস্পষ্ট' যতক্ষণ না আপনি এটি কী শিখেন। ofমানে আউটপুট ফাইল এবং ddএটি লিনাক্স এবং ওএসএক্স উভয় ক্ষেত্রেই ব্যবহৃত হয় (বেশিরভাগ ক্ষেত্রে ডিস্কে ছবি লেখার জন্য)। এটি নিশ্চিত একটি ঝরঝরে কৌশল।
ব্লকলুপ

12
ddসম্ভবত teeএখানে সমানভাবে দরকারী । উভয় ক্ষেত্রেই আপনি একটি সাধারণ, সুপরিচিত কমান্ড একটি উদ্দেশ্যে ব্যবহার করছেন যা তার মূল উদ্দেশ্যেটি থেকে কিছুটা পৃথক হলেও এখনও সুপরিচিত এবং ডকুমেন্টেড। যদিও ddডাটা বিশাল পরিমাণ কপি ভালো, এটা অল্প পরিমাণে সঙ্গে হয় নাই। স্ট্যান্ডার্ড আউটপুটে পাশাপাশি আউটপুট প্রতিধ্বনি না করার সুবিধা রয়েছে।
থোমাসরুটটার

26
যখনই আপনি sudo ddএকে অপরের পাশে শব্দগুলি টাইপ করেন, আপনি খুব নিশ্চিতভাবেই তা নিশ্চিত করতে চান যে অনুসরণ করা যুক্তিগুলি সঠিক (বিশেষত এর অ-মানক সিনট্যাক্স বিবেচনা করে)। তারা এটিকে কিছুতেই "ডিস্ক ধ্বংসকারী" বলে না ...
ali_m

45

সমস্যাটি হ'ল কমান্ডটি চালিত হয় sudoতবে পুনর্নির্দেশটি আপনার ব্যবহারকারীর অধীনে চলে। এটি শেল দ্বারা করা হয় এবং এটি সম্পর্কে আপনি খুব কম করতে পারেন।

sudo command > /some/file.log
`-----v-----'`-------v-------'
   command       redirection

এটিকে বাইপাস করার স্বাভাবিক উপায়গুলি হল:

  • আপনি সুডোর অধীনে কল করেন এমন কোনও স্ক্রিপ্টে কমান্ডগুলি মোড়ানো।

    যদি কমান্ড এবং / অথবা লগ ফাইল পরিবর্তন হয়, আপনি স্ক্রিপ্টটিকে আর্গুমেন্ট হিসাবে নিতে পারেন। উদাহরণ স্বরূপ:

    sudo log_script command /log/file.txt
    
  • একটি শেল কল করুন এবং পরামিতি হিসাবে কমান্ড লাইনটি পাস করুন -c

    এটি অফ অফ কমপઉન્ડ কমান্ডের জন্য বিশেষত কার্যকর। উদাহরণ স্বরূপ:

    sudo bash -c "{ command1 arg; command2 arg; } > /log/file.txt"
    

23

থিমটি নিয়ে আরও একটি ভিন্নতা:

sudo bash <<EOF
ls -hal /root/ > /root/test.out
EOF

বা অবশ্যই:

echo 'ls -hal /root/ > /root/test.out' | sudo bash

তাদের (ক্ষুদ্র) সুবিধাটি রয়েছে যে আপনার sudoবা sh/ অথবা কোনও যুক্তি মনে রাখার দরকার নেইbash


18

টি বিকল্পটি কেন পছন্দনীয় সে সম্পর্কে কিছুটা স্পষ্ট করা

ধরে নিই যে আউটপুট তৈরি করে এমন কমান্ডটি কার্যকর করার জন্য আপনার কাছে যথাযথ অনুমতি রয়েছে, আপনি যদি আপনার কমান্ডের আউটপুট টি করতে পাইপ করেন তবে আপনাকে কেবল প্রশ্নযুক্ত ফাইলটিতে sudo এবং সরাসরি টি লিখতে (বা সংযোজন) টির সাথে টি এর প্রাইভলেজগুলি উন্নত করতে হবে।

প্রশ্নে দেওয়া উদাহরণে এর অর্থ হবে:

ls -hal /root/ | sudo tee /root/test.out

আরও কয়েকটি ব্যবহারিক উদাহরণের জন্য:

# kill off one source of annoying advertisements
echo 127.0.0.1 ad.doubleclick.net | sudo tee -a /etc/hosts

# configure eth4 to come up on boot, set IP and netmask (centos 6.4)
echo -e "ONBOOT=\"YES\"\nIPADDR=10.42.84.168\nPREFIX=24" | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth4

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

এটি এইভাবে করা ভাল ধারণা কারণ আউটপুট উত্পন্ন উত্সটি উন্নত সুবিধাগুলি দিয়ে কার্যকর করা হয় না। এটি এখানে গুরুত্বপূর্ণ মনে হয় না echoতবে যখন সোর্স কমান্ডটি এমন কোনও স্ক্রিপ্ট যা আপনি পুরোপুরি বিশ্বাস করেন না, এটি অত্যন্ত গুরুত্বপূর্ণ।

দ্রষ্টব্য আপনি >>লক্ষ্য ফাইলটিতে এ্যাপ্রেটেড (লাইক ) যুক্ত করার পরিবর্তে এটির (-র) বিকল্প ব্যবহার করতে পারেন >


দুঃখিত js3, তবে এটি ইতিমধ্যে প্রস্তাবিত হয়েছে (২০০৮ সালে ফিরে) এবং দ্বিতীয় সর্বোচ্চ উত্তরে বসে আছে: stackoverflow.com/a/82553/6910
জোনাথন

2
আপনি ঠিক বলেছেন, জোনাথন, আমি কেন এই পছন্দনীয় বিকল্পটির কারণগুলিতে প্রসারিত করতে আমার উত্তর আপডেট করব। সহায়ক মতামতের জন্য ধন্যবাদ।
jg3


11

এই সমস্যাটি সম্পর্কে আমি যেভাবে যাব তা হ'ল:

আপনার যদি ফাইলটি লিখতে / প্রতিস্থাপন করতে হয়:

echo "some text" | sudo tee /path/to/file

আপনার যদি ফাইলটিতে সংযোজন প্রয়োজন হয়:

echo "some text" | sudo tee -a /path/to/file

1
উপরের উত্তরের তুলনায় এটি কীভাবে আলাদা?
জোনাথন

2
এটি "যথেষ্ট আলাদা" নয় তবে এটি ফাইলটি প্রতিস্থাপন এবং সংযোজনের মধ্যে স্বতন্ত্র ব্যবহারের বিষয়টি স্পষ্ট করে।
জামাদগনি

1
এই উত্তরটি আমি আমার ঠকানো শীটে অনুলিপি করেছি।
মর্টিমারগেটজ

5

কীভাবে স্ক্রিপ্ট লেখার কথা?

ফাইলের নাম: মাইক্রিপ্ট

#!/bin/sh

/bin/ls -lah /root > /root/test.out

# end script

তারপরে স্ক্রিপ্টটি চালাতে sudo ব্যবহার করুন:

sudo ./myscript

4

যখনই আমাকে এর মতো কিছু করতে হবে আমি কেবল রুট হয়ে যাই:

# sudo -s
# ls -hal /root/ > /root/test.out
# exit

এটি সম্ভবত সবচেয়ে ভাল উপায় নয়, তবে এটি কার্যকর হয়।


4

আমি এটি এইভাবে করব:

sudo su -c 'ls -hal /root/ > /root/test.out'

2
এটি আসলে কিছুটা পরিষ্কার পরিচ্ছন্ন বলে মনে হচ্ছে, কারণ আপনার শেলটি স্পষ্টভাবে নির্দিষ্ট করার দরকার নেই।
স্টিভ বেনেট

1
একটি ছোট অসুবিধা হ'ল এটি একটি অতিরিক্ত প্রক্রিয়া চালায় ( su): $ sudo su -c 'pstree -sp $$ >/dev/fd/1' init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411)
পাবুক

3

কোনও মৃত ঘোড়াটিকে মারধর করার অর্থ নয়, তবে এখানে প্রচুর উত্তর রয়েছে যা ব্যবহার করা teeহচ্ছে যার অর্থ আপনি যদি পর্দার অনুলিপি দেখতে না চান তবে আপনাকে পুনঃনির্দেশ stdoutকরতে /dev/nullহবে।

একটি সহজ সমাধানটি কেবল এটির catমতো ব্যবহার করা :

sudo ls -hal /root/ | sudo bash -c "cat > /root/test.out"

লক্ষ্য করুন যে কীভাবে পুনর্নির্দেশগুলি কোটের ভিতরে রাখা হয়েছে যাতে এটি sudoচালিত শখের পরিবর্তে শুরু করা শেল দ্বারা মূল্যায়ন করা হয় ।


এটি ঠিক কাজ করে। কেন এটির একটি নেতিবাচক ভোট ছিল তা আমি বুঝতে পারি না। সম্মত।
তিমু লেইস্তি

4
আমি মনে করি এটি বেশি ভালোবাসা পায় না কারণ এটি এর চেয়ে ভাল নয় sudo bash -c "ls -hal /root > /root/test.out"। টি ব্যবহার করে শেলের প্রয়োজন এড়ানো যায়, যখন বিড়াল দেয় না।
নিক রুসো

2

এটি জড়িত উত্তরের উপর ভিত্তি করে tee। জিনিসগুলিকে আরও সহজ করার জন্য আমি একটি ছোট স্ক্রিপ্ট লিখেছি (আমি এটি কল করি suwrite) এবং অনুমতি /usr/local/bin/সহ এটিতে রেখেছি +x:

#! /bin/sh
if [ $# = 0 ] ; then
    echo "USAGE: <command writing to stdout> | suwrite [-a] <output file 1> ..." >&2
    exit 1
fi
for arg in "$@" ; do
    if [ ${arg#/dev/} != ${arg} ] ; then
        echo "Found dangerous argument ‘$arg’. Will exit."
        exit 2
    fi
done
sudo tee "$@" > /dev/null

কোডটিতে ইউএসএজে দেখানো হয়েছে , আপনাকে যা করতে হবে তা হ'ল এই স্ক্রিপ্টটিতে আউটপুটটি পাইপ করা হবে তারপরে কাঙ্ক্ষিত সুপারসার-অ্যাক্সেসযোগ্য ফাইলের নাম এবং এটি প্রয়োজন হলে স্বয়ংক্রিয়ভাবে আপনাকে আপনার পাসওয়ার্ডের জন্য অনুরোধ জানাবে (যেহেতু এটি অন্তর্ভুক্ত রয়েছে sudo)।

echo test | suwrite /root/test.txt

নোট করুন যেহেতু এটি একটি সহজ মোড়ক হিসাবে teeএটি এটি সংযুক্ত -aকরার জন্য টি'র বিকল্পটি গ্রহণ করবে এবং একই সাথে একাধিক ফাইলগুলিতে লিখনকে সমর্থন করবে।

echo test2 | suwrite -a /root/test.txt
echo test-multi | suwrite /root/test-a.txt /root/test-b.txt

এটিতে /dev/ডিভাইসে লেখার বিরুদ্ধে কিছু সরল সুরক্ষা রয়েছে যা এই পৃষ্ঠার মন্তব্যের একটিতে উল্লিখিত উদ্বেগ ছিল।


1

হতে পারে আপনি কেবল কয়েকটি প্রোগ্রাম / পাথকে সুডো অ্যাক্সেস পেয়েছেন? তারপরে আপনি যা চান তা করার কোনও উপায় নেই। (যদি না আপনি এটি কোনওভাবে হ্যাক করবেন)

যদি এটি না হয় তবে আপনি বাশ স্ক্রিপ্ট লিখতে পারেন:

cat > myscript.sh
#!/bin/sh
ls -hal /root/ > /root/test.out 

প্রেস ctrl+ + d:

chmod a+x myscript.sh
sudo myscript.sh

আশা করি এটি সাহায্য করবে।


1
sudo at now  
at> echo test > /tmp/test.out  
at> <EOT>  
job 1 at Thu Sep 21 10:49:00 2017  

1
আপনার যদি sudoযাইহোক atথাকে তবে দরকারী বা প্রয়োজনীয় নয়। sudo sh -c 'echo test >/tmp/test.out'একই কাজটি আরও দক্ষতার সাথে এবং মার্জিতভাবে করে (তবে এখনও এই ত্রুটিটি ভুগছে যে আপনি সম্ভবত এমন জিনিস চালাচ্ছেন rootযার পক্ষে সেই বিশেষাধিকারের প্রয়োজন নেই; সাধারণত যখন আপনি পারেন তখন সুবিধামত আদেশগুলি এড়ানো উচিত)।
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.