2015-07-02 6 views
5

Я пытаюсь запустить команду терминала в приложении Mac, которое я разрабатываю. Команда терминал:Запустить команду терминала в приложении Mac с Swift Xcode

sudo sysctl -w net.inet.tcp.delayed_ack=0 

Я попытался с помощью NSTask но мне кажется, что я делаю что-то неправильно каждый раз.

Я просто хочу запустить эту команду и распечатать вывод. Благодарим за внимание.

PS. вот что мой текущий код выглядит следующим образом (благодаря вашим ответам):

let task = NSTask() 
task.launchPath = "/usr/sbin/sysctl" 
task.arguments = ["-w", "net.inet.tcp.delayed_ack=0"] 
let pipe = NSPipe() 
task.standardOutput = pipe 
task.standardError = pipe 
task.launch() 
task.waitUntilExit() 
let data = pipe.fileHandleForReading.readDataToEndOfFile() 
let output: String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 

Я получаю следующее сообщение в выводе:
net.inet.tcp.delayed_ack: 3
Sysctl: net.inet. tcp.delayed_ack = 0: Операция не разрешена

+0

Вы не показали, что вы пробовали, но я предполагаю, что вы не можете просто называть sudo как NSTask, так как для авторизации пользователя (включая возможные всплывающие диалоги) очень важно настроить специальные функции. Сравните http://stackoverflow.com/questions/4050687/how-to-use-nstask-as-root. –

+0

Спасибо за ваш ответ. Я также добавил свой текущий код к вопросу. – MRF

+0

Как я уже сказал, есть, вероятно, общие проблемы с вашим подходом. Посмотрите на связанную нить. –

ответ

5

Попробуйте это и дайте мне знать, если это сработает. Вы должны сделать это в фоновом потоке, используя dispatch_async или NSOperationQueue. Для получения более подробной информации о том, как делать вещи, используя Grand Central Dispatch прочитал мой пост: http://manavgabhawala.me/#/blog/grand-central-dispatch

let task = NSTask() 
task.launchPath = "/usr/sbin/sysctl" 
task.arguments = ["-w", "net.inet.tcp.delayed_ack=0"] 
let pipe = NSPipe() 
task.standardOutput = pipe 
task.standardError = pipe 
task.launch() 
task.waitUntilExit() 
let data = pipe.fileHandleForReading.readDataToEndOfFile() 
let output: String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 

Также пожалуйста, вы можете обновить вопрос, чтобы включить точную ошибку и код, который вы используете с NSTask, если это не работает , Теперь это не будет иметь эффект sudo, который вы хотите, если хотите посмотреть: https://developer.apple.com/library/mac/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html, в котором рассказывается о том, как использовать sudo. Для неподдерживаемого приложения вы также можете сделать то же самое, что и выше, но измените launchPath на /bin/sh, а затем добавьте аргумент "-S", а также добавьте аргумент "/usr/sbin/sysctl". Затем вы можете использовать standardInput для подключения к паролю пользователя, у которого есть корневой доступ. Все ошибки ввода пароля будут поступать в стандартный канал ошибок. Дайте мне знать, если это сработает.

+0

Спасибо Манаву за подробный ответ. Я использовал ваше решение, и оно значительно улучшило мой код, но я получил следующее выходное сообщение: net.inet.tcp.delayed_ack: 3 sysctl: net.inet.tcp.delayed_ack = 0: операция не разрешена – MRF

+0

Вы уверены ваше приложение не изолировано? Также вы пробовали мой код, как есть, или вы пытались запустить путь bin/sh и дополнительные аргументы? Также, если вы сделали это с помощью sudo, вы уверены, что правильно настроили канал на стандартный вход и предоставили пароль доступа root? –

+0

@ManavGabhawala ссылка больше не активна. Ваш сайт переехал? –

Смежные вопросы