Ubuntu en heel wat andere Linux-distributies maken gebruik van sudo om een programma uit te voeren waarvoor je root-privileges nodig hebt. Dat is heel handig, maar als je de uitvoer van dit programma naar een bestand wil wegschrijven waarvoor je ook root-privileges nodig hebt, kom je in de problemen. De shell redirection wordt immers door je shell uitgevoerd, en dus met je eigen privileges. Een voorbeeld:

sudo iptables -L > /etc/iptables

geeft je een 'Permission denied' foutmelding. Je shell voert immers 'iptables -L' als root uit, en probeert de uitvoer van het programma dan naar /etc/iptables te schrijven, wat mislukt omdat de shell slechts je gewone gebruikersprivileges heeft.

Eén oplossing is om het hele commando in een afzonderlijke shell uit te voeren, bijvoorbeeld:

sudo sh -c 'iptables -L > /etc/iptables'

Een andere oplossing is om het programma tee te gebruiken, dat zijn stdin splitst door het tegelijk naar stdout en een bestand te schrijven. Als je dan tee uitvoert met sudo en zijn uitvoer naar /dev/null stuurt, kun je wel de uitvoer van het voorgaande programma naar een geprivilegieerd bestand schrijven. Voor ons voorbeeld wordt dit:

sudo iptables -L | sudo tee /etc/iptables > /dev/null

Vim

Een andere handige toepassing van tee is wanneer je een configuratiebestand aan het aanpassen bent in Vim en dan tijdens het opslaan plots merkt dat je niet genoeg privileges hebt. De meest voor de hand liggende oplossing is om het resultaat op te slaan in een tijdelijk bestand en dan met sudo te kopiëren naar de originele locatie. Er is echter een snellere oplossing door in Vim de volgende one-liner als commando in te geven:

:w !sudo tee %

Wat doet dit? Met :w !{commando} schrijf je de uitvoer van het bestand dat je aan het aanpassen bent naar stdin van het opvolgende commando, in dit geval sudo tee %. Dit voert tee % dus als root-gebruiker uit, en % is een register in Vim dat de bestandsnaam van het huidige bestand bevat. Het resultaat: de inhoud van het bestand dat je aan het aanpassen bent, wordt geschreven naar het bestand zelf, maar dan als root. Daarvoor vraagt sudo je ook nog je wachtwoord. Daarna merkt Vim dat het bestand extern aangepast is, en accepteer je de wijzigingen door op L (voor Load File) te drukken. Hetzelfde principe werkt overigens onder (Open)Solaris met pfexec in plaats van sudo.

Bron: Techworld