簡體   English   中英

使用Objective-C / Cocoa以root身份運行Bash腳本

[英]Run a Bash script as root with Objective-C / Cocoa

假定在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的腳本嗎?

我強烈建議不要使用像這樣的外部腳本。 使用NSFileManager執行此操作要好得多,並將其保留在受控代碼中。 但是對於如何成為root的問題,您想要查看授權服務 該站點將指導您如何創建升級其權限的應用程序,包括適當的UI元素。

如果我理解您想要做什么,那么您是否正在嘗試讓非特權用戶無需進行身份驗證即可執行特權操作?

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!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM