Wie hängt man eine Datei als sudo an?

271

Ich will das tun:

echo "something" >> /etc/config_file

Da jedoch nur der Root-Benutzer Schreibrechte für diese Datei hat, kann ich das nicht tun. Aber das Folgende funktioniert auch nicht.

sudo echo "something" >> /etc/config_file

Gibt es in dieser Situation eine Möglichkeit, an eine Datei anzuhängen, ohne sie zuerst mit einem sudod-Editor öffnen und dann den neuen Inhalt manuell anhängen zu müssen ?

hsribei
quelle
Ich benutze Ubuntu 9.04 und kann sudo für jeden Befehl verwenden, den ich bisher benötigt habe. Das Laichen einer Unterschale hat funktioniert.
Matt Norris

Antworten:

391

Verwenden Sie tee -a(oder tee --append) mitsudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

So wird dein Befehl

echo "something" | sudo tee -a /etc/config_file

Die Vorteile teegegenüber der Ausführung von Bash mit Administratorrechten sind:

  • Sie führen Bash nicht mit Administratorrechten aus
  • Nur der Teil "In Datei schreiben" wird mit erweiterten Berechtigungen ausgeführt
  • Das Zitieren eines komplexen Befehls ist viel einfacher
Akira
quelle
2
Unter OS X scheint tee nur ein -a Flag zu haben.
Lri
Debian 8 teehat das -aAnhänge-Flag.
Sand
9
Verwenden echo "output" | sudo tee -a file > /dev/nullSie diese Option, wenn Sie die Konsolenausgabe überspringen möchten.
Moshe Bixenshpaner
Funktioniert auch gut für die WSL.
KayleeFrye_onDeck
50

Die Umleitung wird in der aktuellen Shell ausgeführt. Um die Umleitung mit erhöhten Rechten durchzuführen, müssen Sie die Shell selbst mit erhöhten Rechten ausführen:

sudo bash -c "somecommand >> somefile"
Ignacio Vazquez-Abrams
quelle
26

Lassen Sie sudo eine Sub-Shell erzeugen:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

In diesem Beispiel führt sudo "sh" mit dem Rest als Argument aus.

(Dies ist ein Beispiel in der sudo-Manpage)

Doug Harris
quelle
8
Der Grund ist, dass es Ihre Shell (die so läuft wie Sie) ist, die die Umleitung vornimmt, nicht sudo. Da Sie keine Berechtigung zum Schreiben in die Datei haben, wird der Fehler "Berechtigung verweigert" angezeigt. Mit dieser Antwort wird eine neue Shell gestartet, die als Root ausgeführt wird und daher in die Datei schreiben kann.
Randy Orrison
Das ist nicht die richtige Antwort. Das ist eine richtige Antwort. Akira hat eine bessere für die in dieser Antwort enthaltene Logik.
TOOGAM
6

Ich benutze normalerweise die Shell HIER document with sudo tee -a . Etwas in der Art von:

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF
Nicholas Sushkin
quelle
4

Meiner Meinung nach ist das Beste in diesem Fall dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END
user316693
quelle
3

Möglicherweise liegt ein Problem mit dem Sudo und der Umleitung vor. Verwenden Sie stattdessen einen Texteditor Ihrer Wahl, um die Zeile hinzuzufügen.

sudo nano /etc/profile

Oder Sie könnten es stattdessen mit su versuchen

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit
Bobby
quelle
Leider ergab dies das gleiche Ergebnis.
Matt Norris
1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'sollte arbeiten. da es nichts gibt, was die Shell fälschlicherweise in das Argument einbauen kann, um den Gesamtbefehl in Anführungszeichen zu setzen.
Quack Quijote
Das ist fantastisch. Tun Sie dies jetzt als Teil eines Skripts.
Ernie Dunbar
0

Dies funktioniert nicht, wenn Sie versuchen, >>die Ausgabe von sudo umzuleiten (zu verwenden ). Was Sie wirklich tun möchten, ist die Ausgabe von umzuleiten echo. Ich schlage vor, Sie verwenden einfach Ihren bevorzugten Editor und fügen diese Zeile manuell hinzu /etc/profile. Dies hat den zusätzlichen Vorteil, dass Sie prüfen können, ob /etc/profilebereits Sets vorhanden sind JAVA_HOME.

innaM
quelle
0

Verwenden Sie ex- way:

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

und durch FOOIhre Variable ersetzen , um sie anzufügen.

In einigen Systemen (wie z. B. OS X) verfügt die /etc/profileDatei über 444 Berechtigungen. Wenn Sie also weiterhin die Berechtigung verweigert bekommen , überprüfen und korrigieren Sie zuerst die Berechtigung:

sudo chmod 644 /etc/profile

dann nochmal probieren.

Kenorb
quelle