使用 Objective-C / Cocoa 以 root 用户身份运行 Bash 脚本

3

假设在 xCode 项目的资源文件夹中有一个名为 copystuff 的文件,并且该文件内容如下:

#!/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在非管理员帐户调用此代码时运行作为root运行的脚本?或者换句话说,Objective-C能否编码以在非管理员帐户下作为root从/usr/bin运行脚本?

2个回答

7
我强烈建议不要使用外部脚本来完成此操作。最好使用NSFileManager在受控代码内完成此操作。但是,如果您想成为root用户,您需要查看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!

这基本上就是我想做的事情...为了更清晰明了,我在一个教育环境中部署了一个OS 10.5镜像,有3个帐户(管理员、教师、学生)。教师和学生帐户都不是管理员。在请求时,我正在尝试允许非管理员教师帐户将项目从学生帐户复制到教师桌面。该应用程序可以从管理员帐户成功运行,但我希望能够给予教师一些特权操作而不必提供管理员密码... - cit
2
你可能会更幸运地寻找更复杂的权限选项,比如访问控制列表:http://aplawrence.com/MacOSX/acl.html - Carl Norum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接