2016-05-04 7 views
2

Es war einmal sed und tee kombiniert, um eine privilegierte Datei an Ort und Stelle zu ändern. Da die Schale selbst keine Root-Privilegien haben musste ich kreativ Befehlsausgabe in Dateien zu schreiben:Sed in Ort auf privilegierten Symlink

sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts" 1>/dev/null 

Damals dies wunderbar funktioniert. Erst nachdem ich meine Host-Datei für die Anzeigenblockierung verwendet habe, wurde mir klar, dass die Pipe auf einen Puffer beschränkt ist. Danach überschreibt tee die Datei und der Rest der Datei verschwindet.

I als auch eine viel einfachere Version:

sed -r 'script' "/etc/hosts" > "/etc/hosts.tmp" && sudo mv "/etc/hosts.tmp" "/etc/hosts" 

Leider auch das wird nicht funktionieren, da die betreffende Datei ein symbolischer Link ist. Eine mv würde den Symlink überschreiben, im Gegensatz zu der Datei darunter.

Meine aktuelle Lösung ist dies:

sed -r 'script' "/etc/hosts" | sudo tee "/etc/hosts.tmp" 1>/dev/null && 
    sudo cat "/etc/hosts.tmp" | sudo tee "/etc/hosts" 1>/dev/null && 
    sudo rm "/etc/hosts.tmp" 

Ew! Wie ausführlich!

Gibt es eine sauberere Möglichkeit, dies zu tun?

+0

Unbrauchbare Verwendung von 'cat': Verwenden Sie' sudo tee/etc/hosts chepner

+0

Nutzloser Spam nutzlosen Sprichwort. Das würde nicht funktionieren, da es keine Garantie dafür gibt, dass '/ etc/hosts.tmp', das durch 'sudo tee' erstellt wurde, von der Shell gelesen werden kann. –

+0

Sie erstellen die Datei; Es ist nicht notwendig, 'sudo' zu verwenden, um die Datei zu erstellen (noch ist es nicht notwendig, die temporäre Datei in'/etc' zu erstellen). – chepner

Antwort

3

Wenn Sie GNU sed verwenden, können Sie das Flag -i in-place edition verwenden, damit die Ergebnisse seiner Ausführung direkt in der Datei gespeichert werden, die es verarbeitet. Dann müssen Sie nur sudo der sed Befehl und Sie sollten in Ordnung sein.

Zusätzlich zum Schreiben der Datei anstelle des Links verwenden Sie seds --follow-symlinks Flag. In anderen Fällen überprüfen Sie this answer to a similar question on SO.

+0

Ja, aber dann brauche ich noch Reinigung, oder? (Und wenn sed den Eimer stößt, habe ich eine halbe Datei) ** Bearbeiten ** Es macht nichts, anscheinend sind die übrig gebliebenen Dateien nur, wenn Sie ein Suffix für "-i" angeben. Obwohl ich mich wundere, wie es den Unterschied zwischen einem Suffix und einer anderen Flagge erkennen lässt ... –

+0

Eigentlich muss ich diese Antwort abwählen - es stellt sich heraus, dass "sed -i" das selbe Problem hat wie "mv" - es macht meine Symlink in eine Datei! (Ich versuche readlink und realpath und wenn ich eine Combo finde, die funktioniert, hebe ich dich an und poste in der Frage) –

+0

@JV lass mich nachsehen, ob ich etwas finden kann – Aaron