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

时间:2010-02-11 17:51:50

标签: objective-c cocoa bash

鉴于xCode项目的Resources文件夹中有一个名为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 个答案:

答案 0 :(得分:7)

我强烈建议不要使用像这样的外部脚本。使用NSFileManager执行此操作要好得多,并将其保留在受控代码中。但是关于如何成为root的问题,你想看看Authorization Services。本网站将指导您如何创建升级其权限的应用程序,包括适当的UI元素。

答案 1 :(得分: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!