sudo echo "something" >> /etc/privilegedFile لا يعمل
-
01-07-2019 - |
سؤال
هذا سؤال بسيط جدًا، على الأقل يبدو أنه ينبغي أن يكون كذلك، حول أذونات Sudo في Linux.
هناك الكثير من الأوقات التي أرغب فيها فقط في إلحاق شيء ما /etc/hosts
أو ملف مشابه ولكن ينتهي الأمر بعدم القدرة على القيام بكليهما >
و >>
غير مسموح بها، حتى مع الجذر.
هل هناك طريقة ما لإنجاز هذا العمل دون الحاجة إلى ذلك su
أو sudo su
في الجذر؟
المحلول
يستخدم tee --append
أو tee -a
.
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list
تأكد من تجنب علامات الاقتباس داخل علامات الاقتباس.
لتجنب طباعة البيانات مرة أخرى إلى وحدة التحكم، قم بإعادة توجيه الإخراج إلى /dev/null.
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list > /dev/null
نصائح أخرى
تكمن المشكلة في أن الصدفة تقوم بإخراج إعادة التوجيه، وليس sudo أو echo، لذلك يتم القيام بذلك كمستخدم عادي.
جرب مقتطف الكود التالي:
sudo sh -c "echo 'something' >> /etc/privilegedfile"
تكمن المشكلة في أن الصدفة الخاصة بك هي التي تتولى إعادة التوجيه؛يحاول فتح الملف باستخدام لك الأذونات ليست تلك الخاصة بالعملية التي تقوم بتشغيلها ضمن Sudo.
استخدم شيئًا مثل هذا، ربما:
sudo sh -c "echo 'something' >> /etc/privilegedFile"
sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
عمل
sudo sh -c "echo >> somefile"
يجب أن تعمل.تكمن المشكلة في أنه يتم التعامل مع > و >> بواسطة Shell الخاص بك، وليس عن طريق الأمر "sudoed"، وبالتالي فإن الأذونات هي أذوناتك، وليست تلك الخاصة بالمستخدم الذي "sudoing" إليه.
أود أن أشير، للفضوليين، أنه يمكنك أيضًا اقتباس مهرطق (للكتل الكبيرة):
sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<plist version=\"1.0\">
<dict>
<key>Label</key>
<string>com.company.ipfw</string>
<key>Program</key>
<string>/sbin/ipfw</string>
<key>ProgramArguments</key>
<array>
<string>/sbin/ipfw</string>
<string>-q</string>
<string>/etc/ipfw.conf</string>
</array>
<key>RunAtLoad</key>
<true></true>
</dict>
</plist>
EOIPFW"
في باش يمكنك استخدامها tee
بالاشتراك مع > /dev/null
للحفاظ على نظافة stdout.
echo "# comment" | sudo tee -a /etc/hosts > /dev/null
استخدام إجابة يو, ، ضع هذا في حسابك ~/.bashrc
:
sudoe() {
[[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
echo "$1" | sudo tee --append "$2" > /dev/null
}
الآن يمكنك الركض sudoe 'deb blah # blah' /etc/apt/sources.list
يحرر:
إصدار أكثر اكتمالًا يسمح لك بإدخال الإدخال أو إعادة التوجيه من ملف ويتضمن ملف -a
قم بالتبديل لإيقاف تشغيل الإلحاق (الذي يتم تشغيله افتراضيًا):
sudoe() {
if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then
shift &>/dev/null || local failed=1
else
local append="--append"
fi
while [[ $failed -ne 1 ]]; do
if [[ -t 0 ]]; then
text="$1"; shift &>/dev/null || break
else
text="$(cat <&0)"
fi
[[ -z "$1" ]] && break
echo "$text" | sudo tee $append "$1" >/dev/null; return $?
done
echo "Usage: $0 [-a|--no-append] [text] <file>"; return 1
}
تستطيع ايضا استخذام sponge
من moreutils
package ولا تحتاج إلى إعادة توجيه الإخراج (أي لا tee
الضوضاء للاختباء):
echo 'Add this line' | sudo sponge -a privfile
صدى 'hello world' | (sudo tee -a /etc/apt/sources.list)
لقد نجح هذا بالنسبة لي:الأمر الأصلي
echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment
أمر العمل
echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment
باستخدام السيد -i مع $ أ ، يمكنك إلحاق نص يحتوي على متغيرات وأحرف خاصة بعد السطر الأخير.
على سبيل المثال، إضافة $NEW_HOST مع $NEW_IP إلى /etc/hosts:
sudo sed -i "\$ a $NEW_IP\t\t$NEW_HOST.domain.local\t$NEW_HOST" /etc/hosts
وأوضح خيارات sed:
- -أنا للمكان
- $ للسطر الأخير
- أ لإلحاق
هل يمكنك تغيير ملكية الملف ثم إعادته مرة أخرى بعد الاستخدام cat >>
لإلحاق؟
sudo chown youruser /etc/hosts
sudo cat /downloaded/hostsadditions >> /etc/hosts
sudo chown root /etc/hosts
شيء من هذا القبيل العمل بالنسبة لك؟