2017-02-27 64 views
0

我需要啓動一個終端命令到xcode。 這是命令:從MacOS App啓動sudo命令Swift

須藤XATTR -d -r com.test.exemple /Desktop/file.extension

我嘗試了

let task = Process() 
     task.launchPath = "/usr/sbin/xattr" 
     task.arguments = ["-d","-r", "com.test.exemple"," /Desktop/file.extension"] 
     let pipe = Pipe() 
     task.standardOutput = pipe 
     task.standardError = pipe 
     task.launch() 
     task.waitUntilExit() 
     let data = pipe.fileHandleForReading.readDataToEndOfFile() 
     let output : String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String 
     print(output) 
+0

,什麼是你嘗試的結果? Sudo通常要求用戶輸入他們的密碼。 –

+0

我不知道該怎麼辦 –

+0

應該以某種方式問我密碼 –

回答

0

這裏的其中一個辦法它在命令之間使用管道。我證實了當我使用註釋掉的行中的參數時,超級用戶創建了該文件。

它在做什麼,這是:

呼應 '密碼' |須藤 - S的/ usr/bin中/ XATTR -d -r com.test.exemple /Desktop/file.extension

func doTask(_ password:String) { 
    let taskOne = Process() 
    taskOne.launchPath = "/bin/echo" 
    taskOne.arguments = [password] 

    let taskTwo = Process() 
    taskTwo.launchPath = "/usr/bin/sudo" 
    taskTwo.arguments = ["-S", "/usr/bin/xattr", "-d", "-r", "com.test.exemple", " /Desktop/file.extension"] 
    //taskTwo.arguments = ["-S", "/usr/bin/touch", "/tmp/foo.bar.baz"] 

    let pipeBetween:Pipe = Pipe() 
    taskOne.standardOutput = pipeBetween 
    taskTwo.standardInput = pipeBetween 

    let pipeToMe = Pipe() 
    taskTwo.standardOutput = pipeToMe 
    taskTwo.standardError = pipeToMe 

    taskOne.launch() 
    taskTwo.launch() 

    let data = pipeToMe.fileHandleForReading.readDataToEndOfFile() 
    let output : String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String 
    print(output) 
} 
+1

這會引發一個錯誤'Could not posix_spawn:error 1' – Cyrus