linux - আউটপুট পুনঃনির্দেশিত করার জন্য আমি কোনও জায়গায় অবস্থান করার অনুমতি দেয়ার জন্য কিভাবে সুডো ব্যবহার করব?




permissions sudo (10)

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

একাধিক সমাধান আছে:

  • Sudo দিয়ে একটি শেল চালান এবং -c বিকল্পটি ব্যবহার করে এটির নির্দেশ দিন:

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

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

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

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

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

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

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

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

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

সমস্যা হল, এই রূপান্তরিত উদাহরণ কাজ করে না:

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

আমি শুধু প্রতিক্রিয়া পেয়েছি:

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

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


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

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

আমি নিজেকে খুঁজে figured একটি কৌশল

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

এই 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 "[email protected]" ; do
    if [ ${arg#/dev/} != ${arg} ] ; then
        echo "Found dangerous argument ‘$arg’. Will exit."
        exit 2
    fi
done
sudo tee "[email protected]" > /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/ ডিভাইসগুলিতে লেখার বিরুদ্ধে কিছু সরল সুরক্ষা রয়েছে।


এখানে কেউ শুধু sudoing Tee প্রস্তাব করা হয়েছে:

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

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


কিভাবে একটি স্ক্রিপ্ট লেখা সম্পর্কে?

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

#!/bin/sh

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

# end script

তারপর স্ক্রিপ্ট চালানোর জন্য সুডো ব্যবহার করুন:

sudo ./myscript

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

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

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


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

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

এই বাইপাস স্বাভাবিক উপায় হয়:

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

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

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

    এই যৌগ কমান্ড বন্ধ এক জন্য বিশেষ করে দরকারী। উদাহরণ স্বরূপ:

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

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

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

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

Ctrl + d টিপুন

chmod a+x myscript.sh
sudo myscript.sh

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


Tee বিকল্পটি তুলনামূলকভাবে কেন একটি বিট clarifying

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

উদাহরণে প্রদত্ত উদাহরণে এর অর্থ হ'ল:

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 দিয়ে এখানে ব্যাপার বলে মনে হচ্ছে না কিন্তু যখন সোর্স কমান্ডটি এমন একটি স্ক্রিপ্ট যা আপনি সম্পূর্ণরূপে বিশ্বাস করেন না, এটি অত্যন্ত গুরুত্বপূর্ণ।

উল্লেখ্য আপনি এটিকে (যেমন > )) ওভাররাইট (যেমন > ) এর পরিবর্তে এপেন্ড (যেমন >> ) যোগ করার জন্য টি-এ বিকল্পটি ব্যবহার করতে পারেন।





permission-denied