Frage Wie an eine Datei als Sudo anhängen?


Mögliche Duplikate:
sudo konnte nicht in / etc / profile schreiben 

Ich will das tun:

echo "something" >> /etc/config_file

Aber da nur der Benutzer root Schreibrechte für diese Datei hat, kann ich das nicht tun. Das Folgende funktioniert aber auch nicht.

sudo echo "something" >> /etc/config_file

Gibt es eine Möglichkeit, eine Datei in dieser Situation anzuhängen, ohne sie zuerst mit a öffnen zu müssen? sudoEditor und dann den neuen Inhalt von Hand anhängen?


220
2018-05-01 05:50


Ursprung


Ich benutze Ubuntu 9.04 und kann sudo für jeden Befehl benutzen, den ich bisher benötigt habe. Das Laichen einer Unterschale funktionierte. - Matt Norris
Stark verwandt: Umleitung von stdout zu einer Datei, für die Sie keine Schreibberechtigung haben(auf Unix & Linux). Schwach verwandt: ls mit Verzeichnispfad zeigt Dateien, aber ls mit Dateimuster nicht? - Scott


Antworten:


Das richtige Werkzeug für die richtige Aufgabe:Abschlag"

tee - read from standard input and write to standard output and files

So wird deine Kommandozeile

% echo "output" | sudo tee -a file

Der Vorteil von tee Über die Ausführung von Bash mit administrativen Berechtigungen lautet:

  • Sie führen Bash nicht mit administrativen Berechtigungen aus
  • Nur der 'In Datei schreiben' Teil wird mit erweiterten Berechtigungen ausgeführt
  • Das Zitieren eines komplexen Befehls ist viel einfacher

328
2018-05-01 06:25



Auf OS X-Tee scheint nur eine -a Flagge zu haben. - user495470
Debian 8 tee hat die -a Fahne anhängen. - clay
Benutzen echo "output" | sudo tee -a file > /dev/null wenn Sie die Konsolenausgabe überspringen möchten. - Moshe Bixenshpaner
Funktioniert auch gut für WSL. - kayleeFrye_onDeck


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

sudo bash -c "somecommand >> somefile"

38
2018-05-01 05:54





Habe sudo eine Sub-Shell erzeugt:

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 Argumente aus.

(Dies wird als Beispiel in der Sudo Manpage gezeigt)


22
2017-10-13 14:23



Der Grund ist, dass es Ihre Shell ist (die wie Sie läuft), die die Umleitung ausführt, nicht sudo. Da Sie keine Berechtigung zum Schreiben in die Datei haben, erhalten Sie den Fehler Zugriff verweigert. 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. Dies ist eine richtige Antwort. Akira hat einen besseren, für die Logik in dieser Antwort. - TOOGAM


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

4
2018-04-18 18:03





Ich benutze normalerweise shell HERE Dokument mit 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

4
2018-06-16 16:16





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

sudo nano /etc/profile

Oder Sie könnten stattdessen su versuchen

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

3
2017-10-13 14:10



Leider ergab dies das gleiche Ergebnis. - Matt Norris
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile' sollte arbeiten. Da es nichts gibt, was die Shell irrtümlich in Arg erweitern kann, um zu echo, ziehe den Gesamtbefehl ein. - quack quixote
Das ist fantastisch. Jetzt mache das als Teil eines Skripts. - Ernie Dunbar


Dies wird nicht funktionieren, Sie versuchen, umzuleiten (mit >>) die Ausgabe von sudo. Was Sie wirklich tun möchten, ist die Ausgabe von echo. Ich schlage vor, dass Sie einfach Ihren Lieblingseditor verwenden und diese Zeile manuell hinzufügen /etc/profile. Dies hat den zusätzlichen Vorteil, dass Sie überprüfen können, ob /etc/profile schon setzt JAVA_HOME.


0
2017-10-13 14:36





Benutzen Ex-Weg:

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

und ersetzen FOO mit Ihrer Variablen zum Anhängen.

In einigen Systemen (wie OS X), die /etc/profile Datei hat 444 Berechtigungen, also wenn Sie immer noch bekommen Erlaubnis verweigert, überprüfen und korrigieren Sie zuerst die Berechtigung:

sudo chmod 644 /etc/profile

Versuchen Sie es erneut.


0
2018-05-24 22:22