Schrijf hosts bestand

Beste,

Ik wil graag het /etc/hosts schrijven maar ik krijg deze error:
[code]
Error: You don’t have permission to save the file “hosts” in the folder “etc”.
[/code]

Dit is mijn code:
[code]
[newHosts writeToFile:@"/etc/hosts" atomically:YES encoding:NSUTF8StringEncoding error:&error];
[/code]

Hoe kan ik dit oplossen, dit werkt ook niet:
[code]
if (![[BLAuthentication sharedInstance] isAuthenticated:@"/etc/hosts"])
[[BLAuthentication sharedInstance] authenticate:@"/etc/hosts"];
[/code]

kennelijk wil je dat met een script doen.
handmatig moet het met sudo
op die manier ben je tijdelijk super-user / root
en dan mag je alles :)

Zou Little Snitch trouwens geen betere uitkomst bieden voor jouw? Daarmee kan je zelf exact bepalen welk verkeer binnen en buiten gaat.

Hosts is ook als tekstbestand te benaderen, het is dan makkelijk en overzichtelijk te bewerken zonder naar de terminal te gaan. Je hebt er dan ook alleen beheerdersrechten voor nodig en hoeft niet naar de sudo te grijpen. Ik zie trouwens ook niet waar je heen wil schrijven met je script...

Zeg maar dat via de terminal de DOS-manier is en via het tekstbestand de Apple-manier... Onderstaand is de mijne, dat had ik via de terminal of LittleSnitch toch wat lastiger ingesteld dan door gewoon een rijtje adressen van internet af te plukken en die te plakken...

[code]
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
# Goto folder /etc
##
127.0.0.1 localhost
# Block Adobe Activation
127.0.0.1 hl2rcv.adobe.com
127.0.0.1 t3dns.adobe.com
127.0.0.1 3dns-1.adobe.com
127.0.0.1 3dns-2.adobe.com
127.0.0.1 3dns-3.adobe.com
127.0.0.1 3dns-4.adobe.com
127.0.0.1 activate.adobe.com
127.0.0.1 activate-sea.adobe.com
127.0.0.1 activate-sjc0.adobe.com
127.0.0.1 activate.wip.adobe.com
127.0.0.1 activate.wip1.adobe.com
127.0.0.1 activate.wip2.adobe.com
127.0.0.1 activate.wip3.adobe.com
127.0.0.1 activate.wip4.adobe.com
127.0.0.1 adobe-dns.adobe.com
127.0.0.1 adobe-dns-1.adobe.com
127.0.0.1 adobe-dns-2.adobe.com
127.0.0.1 adobe-dns-3.adobe.com
127.0.0.1 adobe-dns-4.adobe.com
127.0.0.1 ood.opsource.net
127.0.0.1 practivate.adobe
127.0.0.1 practivate.adobe.com
127.0.0.1 tpractivate.adobe.newoa
127.0.0.1 practivate.adobe.ntp
127.0.0.1 practivate.adobe.ipp
127.0.0.1 ereg.adobe.com
127.0.0.1 ereg.wip.adobe.com
127.0.0.1 ereg.wip1.adobe.com
127.0.0.1 ereg.wip2.adobe.com
127.0.0.1 ereg.wip3.adobe.com
127.0.0.1 ereg.wip4.adobe.com
127.0.0.1 wip.adobe.com
127.0.0.1 wip1.adobe.com
127.0.0.1 wip2.adobe.com
127.0.0.1 wip3.adobe.com
127.0.0.1 wip4.adobe.com
127.0.0.1 www.wip.adobe.com
127.0.0.1 www.wip1.adobe.com
127.0.0.1 www.wip2.adobe.com
127.0.0.1 www.wip3.adobe.com
127.0.0.1 www.wip4.adobe.com
127.0.0.1 wwis-dubc1-vip60.adobe.com
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost

[/code]

Maak een kopie op het bureaublad, bewerk die en sla die op. Verplaats je originele bestand naar een tijdelijke map en wis hem uit de map /etc. Verplaats dan pas je bewerkte bestand naar /etc. Gedurende dit proces zal je een aantal keer om het beheerderswachtwoord gevraagd worden.

Alles wat in /etc/ staat is een systeembestand en die mag je als gebruiker niet aanpassen. Daarvoor zijn beheerdersrechten (aka root privileges) voor nodig en dat verkrijg je [b][i]o.a.[/i][/b] middels sudo wanneer je gebruikersaccount is ingesteld als Admin (het mag de Mac beheren). Wees echter behoedzaam bij het aanpassen van deze systeembestanden want je kunt daar het systeem aardig goed mee om zeep helpen. Besef je ook dat als je problemen hebt met een bepaalde site te bereiken je na aanpassen van het hosts bestand wel eerst even daar in moet kijken of er niet toevallig iets in staat die het probleem kan veroorzaken.

Btw, ik neem aan dat "atomically" "automatic" moet zijn :)

Zie [url=http://stackoverflow.com/questions/4599447/cocoa-gaining-root-access-for-nsfilemanager]Cocoa - Gaining Root Access for NSFileManager[/url] op stackoverflow.com

[quote]ik neem aan dat "atomically" "automatic" moet zijn[/quote]Ik heb even moeten wennen aan woorden als atomically, atomicity en nonatomic maar het staat er echt. Het is een method van NSString[code]- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error[/code]useAuxiliaryFile
If YES, the receiver is written to an auxiliary file, and then the auxiliary file is renamed to path. If NO, the receiver is written directly to path. The YES option guarantees that path, if it exists at all, won’t be corrupted even if the system should crash during writing.

Mijn bedoeling is om dit in een app te verwerken.

iOS of OS X?

OS X

Als je het in je app verwerkt zorg dan ook even dat de directory service cache even verwijderd. Hierdoor zorg je dat bij de volgende DNS opvraag geen interne cache wordt gebruikt en forceer je dat het host bestand opnieuw wordt ingelezen.

Dat is maar een eenmalige actie die alleen nodig is als de host die je in je hostfile hebt opgenomen al eens eerder is bezocht. De hostfile is overigens hetgeen wat boven alles gaat. DNS queries naar DNS servers komen pas daarna aan bod.

[quote=iep url=http://www.onemorething.nl/community/topic/schrijf-hosts-bestand#post-2497675 time=1355000522]Btw, ik neem aan dat "atomically" "automatic" moet zijn :)[/quote]

For the record: Atomic is een een bepaalde techniek die gebruikt wordt bij het wegschrijven en ophalen van data (bij bestanden alleen wegschrijven). Wanneer atomic wordt gebruikt betekend dat gegevens altijd als een [i]whole[/i] blijft. Bij bestanden wordt dit gedaan door alles op te slaan in een tijdelijk bestand en vervolgens het origineel vervangen met het tijdelijke bestand. Hierdoor zijn incomplete/beschadigde bestanden niet mogelijk; het is opgeslagen of niet. Nadeel is dat atomic wegschrijven naar bestanden of een synthesized getter/setter langzamer is dan nonatomic.