Записать файл в каталог etc в mac os x - PullRequest
1 голос
/ 29 июля 2011

Я пытаюсь записать файл в папку / etc в Mac OS X.

[[textView string] writeToFile:@"/etc/info.txt" atomically:YES encoding:NSUnicodeStringEncoding error:&error];

Выдает ошибку, что у меня нет разрешения на запись туда (естественно), но я не понимаюКак получить разрешение на запись в системные папки.

Также может кто-нибудь привести простой пример?

Пожалуйста, помогите.Спасибо.

Ответы [ 4 ]

3 голосов
/ 20 августа 2012

Заявка "вы никогда не должны писать в / etc /" - папка недействительна.

Конечно, есть много причин для записи в системные папки - если вы пишете корпоративное программное обеспечение, которое настраивает пользователей так, что пользователю не нужно делать это вручную. Это требуется многими корпорациями, чтобы вообще одобрить Mac как рабочие компьютеры. Обычно это делается с помощью сценариев оболочки или языков высокого уровня (таких как Python или Ruby), но для удобства использования конечным пользователем необходимо, чтобы также приложения пользовательского интерфейса могли читать и записывать изменения в системные папки (например, в папку, принадлежащую конфигурации). система управления).

Я пишу профессиональное программное обеспечение, которое должно постоянно записывать в системные папки, изменять содержимое файлов конфигурации и т. Д. В папках, требующих привилегий суперпользователя. Я не достиг 100% успеха в этом, так как MacOSX был слишком недружелюбен для этого варианта использования (корпоративное программное обеспечение для корпоративного внутреннего использования), и подход, который я использую, кажется, иногда не работает. В итоге я открыл диалоговое окно запроса пароля администратора с помощью объекта Apple Script. Это отстой, но работал для моего основного варианта использования:

 NSString *shellCommand = [[NSString alloc] initWithFormat:@"do shell script \"/bin/bash /usr/bin/nameoftheshellscriptgoeshere.sh\" with administrator privileges"];

 NSAppleScript *script;

 script = [[NSAppleScript alloc] initWithSource:shellCommand];

 NSDictionary* errDict = NULL;

 [script executeAndReturnError:&errDict];

Если ваш установщик поместил сценарий оболочки nameoftheshellscriptgoeshere.sh (или любое другое имя, которое вы ему дадите) в / usr / bin, вы можете сделать свое волшебство в сценарии оболочки.

Этот подход работает только в том случае, если административные действия можно выполнить с помощью сценария оболочки. Существует обходной путь, но на самом деле он не очень красив: необходимость записывать файлы конфигурации в системный каталог с помощью приложения Objective C, использование которого приводит к очень утомительному обходному пути: вы создаете измененный файл конфигурации в папку, доступную для записи какао приложение, а затем это приложение выполняет Apple Script, который выполняет сценарий оболочки с одним вкладышем, который копирует этот временный файл конфигурации в его правильное местоположение в системной папке, требующей привилегий root. Это очень неоптимально и неуклюже и вводит зависимость от указанного сценария оболочки - другими словами, приложение пользовательского интерфейса будет работать со сбоями, если сценарий оболочки не установлен в системе. И множество ненужных отдельных частей для обслуживания только по одной единственной причине: повысить привилегии приложения Cocoa сложно или невозможно, а корпоративное программное обеспечение, очевидно, не было точкой проектирования при разработке OSX.

3 голосов
/ 29 июля 2011

Для записи в / etc / потребуется доступ на уровне root. Вам нужно будет спросить у пользователя его пароль, а затем запустить соответствующий вспомогательный инструмент и т. Д., Чтобы сделать фактическую запись для вас.

См. Документацию Задачи авторизации .

В общем случае никогда не пишите в / etc / по любой причине. Это каталог, принадлежащий системе и контролируемый им. Конечно, с учетом основ ОС Unix, есть вещи, которые можно сделать, но только в качестве крайней меры.

1 голос
/ 06 февраля 2015

Для всех, кто сталкивался с этим во время поиска ответов на вопросы:

Если вы просто используете команду "sudo nano directory / file.name", она откроет текстовый редактор nano, а затем вы сможете записать файлы вкаталог / etc / (или любой другой каталог, который вы хотите), поэтому я сделал:

'sudo nano /etc/krb5.conf'

, который открыл текстовый редактор nano и одновременно создалфайл 'krb5.conf' в каталоге etc, тогда все, что мне нужно было сделать, это ввести код и записать файл.Взял около 30-х годов.

1 голос
/ 12 августа 2011

Хорошо, после небольшого исследования я считаю, что нашел более / менее простой метод.Сначала проверьте ссылку: Какао - получение корневого доступа для NSFileManager

Они предлагают использовать уже созданный класс "BLAuthentication" - который позаботится о большом количестве кодов аутентификации для вас.Гугл это скачать, добавить в проект и использовать в своем коде.Вот пример того, как это просто:

id blTmp = [BLAuthentication sharedInstance];

NSString *myCommand = [[NSString alloc] initWithString:@"/bin/cp"];

NSArray *para = [[NSArray alloc] initWithObjects:fileName, @"/etc/", nil];

[blTmp authenticate:myCommand];

if([blTmp isAuthenticated:myCommand] == true) {
    NSLog(@"Authenticated");
    [blTmp executeCommandSynced:myCommand withArgs:para];

} else { NSLog(@"Not Authenticated"); }

[fileName release];
[myCommand release];
[para release];

Естественно, что приведенный выше подход не совсем отвечает на мой собственный вопрос, так как в приведенном выше примере вы не пишете напрямую в «/ etc».Вместо этого сначала мне нужно записать файл в «/ tmp» (или другой каталог по вашему выбору), а затем с помощью команды «cp» в unix скопировать его в «/ etc» (используя «BLAuthentication» для аутентификации).

Это самое простое, что мне удалось найти.

* Примечание. Этот метод может не работать в Lion (Mac OS 10.7), поскольку "BLAuthentication" использует устаревшую функцию "AuthorizationExecuteWithPrivileges".Также я бы предложил посмотреть WWDC 2011, где они расскажут о безопасности и правильных способах решения этой задачи.Однако, если вам нужно создать прототип и / или поиграть с ним, «BLAuthentication» сделает свое дело.

...