707 Stimmen

sudo echo "etwas" >> /etc/privilegedFile funktioniert nicht

Dies ist eine ziemlich einfache Frage, zumindest scheint es so zu sein, über sudo-Berechtigungen in Linux.

Es gibt viele Gelegenheiten, bei denen ich einfach nur etwas anhängen möchte /etc/hosts oder eine ähnliche Datei zu erstellen, was aber nicht möglich ist, weil beide > y >> sind nicht erlaubt, auch nicht mit Root.

Gibt es eine Möglichkeit, dies zu erreichen, ohne dass man su o sudo su in Root?

11voto

msanford Punkte 11045

Für Neugierige sei angemerkt, dass Sie auch ein Heredoc zitieren können (für große Blöcke):

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"

10voto

Vytenis Bivainis Punkte 2178

In der Bash können Sie verwenden tee in Verbindung mit > /dev/null um stdout sauber zu halten.

 echo "# comment" |  sudo tee -a /etc/hosts > /dev/null

10voto

abkrim Punkte 3170

Einige Benutzer kennen die Lösung nicht, wenn sie mehrere Zeilen verwenden.

sudo tee -a  /path/file/to/create_with_text > /dev/null <<EOT 
line 1
line 2
line 3
EOT

5voto

hololeap Punkte 1096

Verwendung von Yoo's Antwort setzen Sie dies in Ihr ~/.bashrc :

sudoe() {
    [[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
    echo "$1" | sudo tee --append "$2" > /dev/null
}

Jetzt können Sie sudoe 'deb blah # blah' /etc/apt/sources.list


Bearbeiten:

Eine vollständigere Version, die es erlaubt, Eingaben in eine Datei zu leiten oder von einer Datei umzuleiten und die eine -a um das Anhängen zu deaktivieren (das standardmäßig aktiviert ist):

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
}

3voto

Michael Goldshteyn Punkte 68533

Sie können auch Folgendes verwenden sponge von der moreutils Paket zu verwenden und die Ausgabe nicht umleiten zu müssen (d. h. keine tee Lärm zu verbergen):

echo 'Add this line' | sudo sponge -a privfile

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X