سؤال

هذا سؤال بسيط جدًا، على الأقل يبدو أنه ينبغي أن يكون كذلك، حول أذونات 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  

شيء من هذا القبيل العمل بالنسبة لك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top