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?
Unbrauchbare Verwendung von 'cat': Verwenden Sie' sudo tee/etc/hosts etc/hosts.tmp'. – chepner
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. –
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