2010-02-11 14 views
3

定根,有一个叫copystuff在一个一个Xcode项目的资源文件夹文件,该文件内容如下:运行bash脚本与Objective-C的/可可

#!/bin/sh 
cp -R /Users/someuser/Documents /Users/admin/Desktop 

如果此位下面的代码链接到IB中的一个按钮......它将在Cocoa应用程序中按下按钮时将/ Users/someuser/Documents目录复制到/ Users/admin ...它在管理员帐户中启动应用程序时起作用(在这里使用OS X 10.5.x)...

NSTask *task = [[NSTask alloc] init]; 
[task setLaunchPath:@"/bin/sh"]; 
[task setArguments:[NSArray arrayWithObjects:[[NSBundle mainBundle] 
pathForResource:@"copystuff" ofType:@"sh"], nil]]; 
[task launch]; 

我的问题是..有没有办法让NSTask运行脚本运行为r或者从非管理员帐户调用此代码?或者问另一种方式..可以将Objective-C编码为以非root用户身份从非管理员账户运行脚本/ usr/bin中的脚本?

回答

7

我强烈建议不要使用这样的外部脚本。用NSFileManager做这件事要好得多,并将其保存在受控代码中。但对于如何成为根的问题,你想看看Authorization Services。本网站将引导您了解如何创建升级其权限的应用程序,其中包括适当的UI元素。

4

如果我明白你想要做什么,你试图让一个非特权用户能够执行特权操作而不需要验证?

setuid shell脚本被认为是一个巨大的安全风险,所以它们被内核拒绝。但是,如果要编写单独的可执行程序,则可以设置set-user-ID-on-execution或set-group-ID-on-execution位并获取所需的行为。要小心,你现在在大的潜在安全问题的土地...

man chmod欲了解更多信息。

这里有一个快速和肮脏的例子:

$ echo "Hello, world!" > file 
$ sudo chown root file 
$ sudo chmod 600 file 
$ cat file 
cat: file: Permission denied 

但我可以写一个程序:

#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) 
{ 
    setuid(0); 
    system("cat file"); 
    return 0; 
} 

它可以做我们想要什么:

$ cc -Wall -o app main.c 
$ chown root app 
$ chmod 4755 app 
$ ./app 
Hello, world! 
+0

这几乎是正是我想要做的......为了不那么神秘,我在一个教育环境中部署的OS 10.5映像上有3个帐户。 (管理员,老师,学生)。教师和学生帐户是非管理员。根据请求,我试图让非管理员教师帐户能够将学生帐户中的项目复制到教师桌面。该应用程序可以从管理员帐户成功运行,但我希望能够给老师一些这些特权行动,而不给他们管理员密码.... – cit 2010-02-11 18:26:15

+2

你可能有更好的运气,寻找更复杂的权限选项,如访问控制列表:http://aplawrence.com/ MacOSX的/ acl.html – 2010-02-11 18:32:51