it-swarm-eu.dev

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

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

In vielen Fällen möchte ich einfach etwas an /etc/hosts Oder eine ähnliche Datei anhängen, kann dies jedoch nicht, da sowohl > Als auch >> Nicht zulässig sind. sogar mit root.

Gibt es eine Möglichkeit, dies zum Laufen zu bringen, ohne su oder Sudo su In root zu müssen?

542
David

Verwenden tee --append oder tee -a.

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list

Vermeiden Sie Anführungszeichen in Anführungszeichen.

Um zu vermeiden, dass Daten zurück zur Konsole gedruckt werden, leiten Sie die Ausgabe nach/dev/null um.

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list > /dev/null

Erinnern Sie sich an die (-a/--append) Flagge! Nur tee funktioniert wie > und überschreibt Ihre Datei. tee -a funktioniert wie >> und schreibt am Ende der Datei.

784
Yoo

Das Problem ist, dass die Shell die Ausgabe umleitet, nicht Sudo oder Echo. Dies geschieht also als Ihr regulärer Benutzer.

Probieren Sie das folgende Code-Snippet:

Sudo sh -c "echo 'something' >> /etc/privilegedfile"
298
Matt P

Das Problem ist, dass Ihre Shell die Umleitung übernimmt. Es wird versucht, die Datei mit Ihren Berechtigungen zu öffnen, nicht mit denen des Prozesses, den Sie unter Sudo ausführen.

Verwenden Sie etwa Folgendes:

Sudo sh -c "echo 'something' >> /etc/privilegedFile"
31
Incident
Sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
17
Vinko Vrsalovic

Tun

Sudo sh -c "echo >> somefile"

sollte arbeiten. Das Problem ist, dass> und >> von Ihrer Shell und nicht vom Befehl "sudoed" verarbeitet werden. Die Berechtigungen sind also Ihre, nicht die des Benutzers, in den Sie "sudoing".

13
agnul

Ich möchte für die Neugierigen bemerken, dass Sie auch einen Heredoc (für große Blöcke) zitieren können:

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"
9
msanford

In bash kannst du tee in Kombination mit > /dev/null um stdout sauber zu halten.

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

Schreibe dies mit Yoos Antwort in dein ~/.bashrc:

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

Jetzt kannst du sudoe 'deb blah # blah' /etc/apt/sources.list


Bearbeiten:

Eine vollständigere Version, mit der Sie Eingaben per Pipe in eine Datei einfügen oder von einer Datei umleiten können und die ein -a Schalter zum Deaktivieren des Anhängens (standardmäßig aktiviert):

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
}
4
hololeap

Sie können auch sponge aus dem Paket moreutils verwenden und müssen die Ausgabe nicht umleiten (d. H. Kein tee Rauschen zum Ausblenden):

echo 'Add this line' | Sudo sponge -a privfile
2

Wie wäre es mit:
Echotext | Sudo dd status = none von = privilegedfile
Ich möchte/proc/sys/net/ipv4/tcp_rmem ändern.
Ich tat:
Sudo dd status = keines von =/proc/sys/net/ipv4/tcp_rmem <<< "4096 131072 1024000"
beseitigt das Echo mit einem einzeiligen Dokument

0
Marcelo Pacheco

echo 'Hallo Welt' | (Sudo tee -a /etc/apt/sources.list)

0
Sudev Shetty

Wenn Sie sed -i mit $ a verwenden, können Sie Text anhängen, der sowohl Variablen als auch enthält Sonderzeichen nach der letzten Zeile.

Beispiel: Hinzufügen von $ NEW_Host mit $ NEW_IP zu/etc/hosts:

Sudo sed -i "\$ a $NEW_IP\t\t$NEW_Host.domain.local\t$NEW_Host" /etc/hosts

optionen erklärt:

  • - i für In-Place
  • $ für die letzte Zeile
  • a zum Anhängen
0
Noam Manos