我正在制作一个简单的应用程序,可让您快速输入要运行的shell命令。 它工作得很好,但是存在sudo命令的问题。 目前,它检测到sudo命令,然后我尝试启动它以显示用户密码的授权窗口,就像您在安装程序中看到的那样。
这是代码一旦检测到它是一个sudo命令:
SFAuthorization *authorization = [[SFAuthorization alloc] initWithFlags:kAuthorizationFlagPreAuthorize rights:NULL environment:kAuthorizationEmptyEnvironment];
if ([authorization obtainWithRight:"com.mycompany.myapplication" flags:kAuthorizationFlagPreAuthorize error:nil]){
//authorized, now run the command using NSTask.
}else{
//fail
}
现在,据我所知,这完全是错误的。这正是我从文档中拼凑而成的内容。有什么想法吗?
答案 0 :(得分:1)
安全很难。我可以解释文档并提供代码片段,但我可能会错。更糟糕的是,即使我的高级描述是正确的,代码片段中很可能会出现一个会破坏安全性的小错误。
如果您要处理权限提升问题,最好的方法是阅读文档并使用提供的示例。
答案 1 :(得分:1)
您需要使用AuthorizationExecuteWithPrivileges函数,如下所示:
- (IBAction)touch: (id) sender {
NSString * filepath = [_filepathfield stringValue];
FILE *commpipe = NULL;
OSStatus execstatus;
NSLog(@"file path is %@", filepath);
char *args[] = {[filepath cString], NULL};
SFAuthorization * authorization = [SFAuthorization authorization];
execstatus = AuthorizationExecuteWithPrivileges([authorization authorizationRef],
"/usr/bin/touch",
kAuthorizationFlagDefaults,
args,
&commpipe);
if (execstatus == errAuthorizationSuccess)
NSlog(@"Toot! It worked");
else
NSLog(@"No dice");
}
鉴于BSD是一种精致而脾气暴躁的花,我建议不要让用户以root身份从应用程序执行任意命令。
/演讲
如果您想从自己的用户那里限制自己程序的功能,那么您示例中的代码就是您要走的路的开始。例如,您可能有一个应用程序只允许某些用户更改已保存文件中的数据。因此,您需要在安全数据库“com.mycompany.LibraryApp.AlterData”中创建一个条目,并在尝试更改数据时检查用户是否具有该权限。但那是一个完全不同的话题......
希望有所帮助, -p
答案 2 :(得分:1)
我知道这是一个非常古老的问题,但对于那些仍在寻找答案的人来说,就是这样。 (它使用AppleScript)
NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"do shell script \"[YOUR SCRIPT HERE]\" with administrator privileges"];
当然,用你的剧本替换[你的脚本],并确保逃脱字符串,可可的方式。
NSDictionary *errorInfo;
[script executeAndReturnError:&errorInfo];
如需进一步说明,请发表评论。