我有一個需要使用sudo執行命令的應用程序。如何獲得密碼,如果成功,請使用NSTask運行sudo命令。使用可可應用中的NSTask執行命令時使用sudo auth會話
3
A
回答
1
使用授權服務Luke。 (如果你見過的「應用程序XYZ需要一個管理員密碼才能繼續」,這是它是如何實現的,它的作用牀單下不使用sudo的。)
3
如果你尋找更輕量級的解決方案,還有另一種方法。我寫了這個通用的實現應該實現你想要的:
- (BOOL) runProcessAsAdministrator:(NSString*)scriptPath
withArguments:(NSArray *)arguments
output:(NSString **)output
errorDescription:(NSString **)errorDescription {
NSString * allArgs = [arguments componentsJoinedByString:@" "];
NSString * fullScript = [NSString stringWithFormat:@"%@ %@", scriptPath, allArgs];
NSDictionary *errorInfo = [NSDictionary new];
NSString *script = [NSString stringWithFormat:@"do shell script \"%@\" with administrator privileges", fullScript];
NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];
NSAppleEventDescriptor * eventResult = [appleScript executeAndReturnError:&errorInfo];
// Check errorInfo
if (! eventResult)
{
// Describe common errors
*errorDescription = nil;
if ([errorInfo valueForKey:NSAppleScriptErrorNumber])
{
NSNumber * errorNumber = (NSNumber *)[errorInfo valueForKey:NSAppleScriptErrorNumber];
if ([errorNumber intValue] == -128)
*errorDescription = @"The administrator password is required to do this.";
}
// Set error message from provided message
if (*errorDescription == nil)
{
if ([errorInfo valueForKey:NSAppleScriptErrorMessage])
*errorDescription = (NSString *)[errorInfo valueForKey:NSAppleScriptErrorMessage];
}
return NO;
}
else
{
// Set output to the AppleScript's output
*output = [eventResult stringValue];
return YES;
}
}
用例:
NSString * output = nil;
NSString * processErrorDescription = nil;
BOOL success = [self runProcessAsAdministrator:@"/usr/bin/id"
withArguments:[NSArray arrayWithObjects:@"-un", nil]
output:&output
errorDescription:&processErrorDescription
asAdministrator:YES];
if (!success) // Process failed to run
{
// ...look at errorDescription
}
else
{
// ...process output
}
帽尖到user950473。
+0
在App Store中允許使用此代碼的應用程序嗎? – sabes
+0
@sables我還沒有嘗試過,所以我不能對此發表評論。 –
相關問題
- 1. 使用sudo執行bundle exec命令
- 2. 使用sudo命令執行tcl
- 3. 使用|執行shell命令(管道)使用NSTask
- 4. 使用NSTask運行終端命令
- 5. 使用NSTask執行離子生成命令 - 不能訪問
- 6. 如何在elisp中使用過濾器執行sudo命令
- 7. 使用java程序執行shell命令時維護會話
- 8. NSTask - 執行echo命令
- 9. 使用NSTask執行shell命令 - Objective-C Cocoa
- 10. 從Node.js的運行命令使用sudo
- 11. 可可應用程序 - NSTask
- 12. 如何使用python腳本在sudo後執行一組命令
- 13. 使用sudo時未找到命令
- 14. 在節點中使用pty和ssh2與sudo執行命令
- 15. 在C程序中使用sudo執行shell命令
- 16. 的node.js執行使用sudo
- 17. Capistrano的,儘管它被關閉執行使用sudo命令
- 18. capistrano使用sudo運行內部命令
- 19. 使用sudo ulimit時找不到命令
- 20. 使用參數在Java中運行可執行命令?
- 21. 通過PHP使用sudo執行shell命令
- 22. on Rails應用程序執行在Ruby中sudo命令
- 23. 使用wget命令執行
- 24. 使用sudo運行命令並進入根(sudo -i)並運行命令
- 25. NsTask執行終端命令的問題
- 26. Java和sudo命令執行
- 27. 使用NSTask交互式訪問命令
- 28. 如何使用php代碼執行sudo命令?
- 29. 如何使我的環境變量可用於sudo命令?
- 30. 使用JSch執行命令
可能的重複[如何使用NSTask授予權限 - objective-c](http://stackoverflow.com/questions/3541654/how-to-give-permission-using-nstask-objective-c) – 2011-07-09 02:27:30
這是不是該問題的重複。這個問題是關於*實際使用sudo *(儘管我同意正確的答案是「使用授權服務」)。 –