2015-07-02 21 views
5

Gelişmekte olduğum bir Mac uygulamasında bir terminal komutu çalıştırmaya çalışıyorum. Terminal komut:Bir Mac uygulamasında, bir Mac uygulamasında Swift Xcode ile Çalıştır

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

Ben NSTask kullanarak denedi ama her zaman yanlış bir şey yapıyorum gibi görünüyor.

Sadece bu komutu çalıştırmak ve çıktıyı yazdırmak istiyorum. İlginiz için teşekkür ederiz.

PS. İşte benim geçerli kod (yanıtların sayesinde) neye benzediği:

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 

ben çıktıda aşağıdaki iletiyi alırsınız:
net.inet.tcp.delayed_ack: 3
sysctl: net.inet. tcp.delayed_ack = 0: Kullanıma izin verilmiyor

+0

Ne denediğinizi göstermediniz, ancak bir kullanıcı için bir NSTask olarak adlandırılamayacağınızı varsayalım, çünkü bir kullanıcıyı yetkilendirmek için çok özel şeyler yapar (olası açılır iletişim kutuları dahil). Http://stackoverflow.com/questions/4050687/how-to-use-nstask-as-root adresini karşılaştırın. Cevabınız için –

+0

teşekkürler. Ayrıca mevcut kodumu soruya ekledim. – MRF

+0

Dediğim gibi, muhtemelen yaklaşımınızla ilgili genel sorunlar var. Bağlantılı iş parçacığına bir göz atın. –

cevap

5

Bunu deneyin ve çalışırsa bana bildirin. Bunu dispatch_async veya NSOperationQueue kullanarak bir arka plan iş parçacığında yapmalısınız. 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 

Ayrıca tam hata ve bu işe yaramazsa size NSTask kullandığınız kod eklemek için soru güncelleyebilirsiniz edin: kullanarak şeyler nasıl yapılacağına ilişkin daha fazla bilgi için Grand Central Sevk benim yazı okumak . Şimdi bu, sudo'nun nasıl kullanılacağını anlatan https://developer.apple.com/library/mac/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html numaralı telefona bakmak istediğiniz sudo efektini kullanmayacaktır. Korumalı olmayan bir uygulama için yukarıdakiyle aynı şeyi yapabilir ancak launchPath değerini /bin/sh olarak değiştirebilir ve ardından "-S" argümanını ekleyebilir ve ayrıca "/usr/sbin/sysctl" argümanını ekleyebilirsiniz. Daha sonra root erişimi olan kullanıcının şifresine standardInput no'lu boruları kullanabilirsiniz. Tüm şifre giriş hataları standart hata borusunda gelir. Bu işe yararsa bana bildirin.

+0

Detaylı cevabınız için teşekkürler Manav. Çözümünüzü kullandım ve kodumu çok geliştirdim ancak şu çıktı iletisini aldım: net.inet.tcp.delayed_ack: 3 sysctl: net.inet.tcp.delayed_ack = 0: İşlem yapılmasına izin verilmiyor – MRF

+0

Emin misiniz? uygulamanız korumalı değil mi? Ayrıca kodumu olduğu gibi denediniz mi yoksa bin/sh çalışma yolu ve ekstra argümanlar ile denediniz mi? Ayrıca sudo'yu yaptıysanız, boruyu standardInput'a doğru şekilde ayarladığınızdan ve root erişim şifresi sağladığınızdan emin misiniz? –

+0

@ManavGabhawala linki artık aktif değil. Web siteniz taşındı mı? –