Objective c 在OSX中使用sudo执行sh文件会出现错误

Objective c 在OSX中使用sudo执行sh文件会出现错误,objective-c,macos,bash,sudo,nstask,Objective C,Macos,Bash,Sudo,Nstask,我开发了一个应用程序,需要在root下运行一些脚本。sh脚本还包含“sudo”命令。为了在根目录下运行sh脚本,我使用github中的STPrivilegedTask类: 下面是我如何运行脚本: NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"my_script" ofType:@"sh"]; STPrivilegedTask *task = [[STPrivilegedTask alloc] initWithLa

我开发了一个应用程序,需要在root下运行一些脚本。sh脚本还包含“sudo”命令。为了在根目录下运行sh脚本,我使用github中的STPrivilegedTask类:

下面是我如何运行脚本:

NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"my_script" ofType:@"sh"];
STPrivilegedTask *task = [[STPrivilegedTask alloc] initWithLaunchPath:scriptPath];
int result = [task launch]; // return error 60031 which means:
//errAuthorizationToolExecuteFailure      = -60031, /* The specified program could not be executed. */
下面是我使用的脚本:

#!/bin/bash
sudo mkdir -p /usr/local/myfolder
sudo su - root -c "launchctl load -F /System/Library/LaunchDaemons/com.mydaemon.daemon.plist"
我使用OSX Mavericks 10.9.4

编辑: 在我为脚本设置“chmod+x my_script.sh”之后,它将运行脚本。但现在我在控制台中收到下一个错误:

sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified

似乎我的管理员凭据没有应用于我运行的脚本。有没有办法解决这个问题?

这里有两个解决方案,我无法测试,因为我目前没有mac电脑

解决方案1:首先使用OSAScript运行命令 解决方案2:使用OSAScript提示输入密码,并与sudo一起使用
这里有两个部分来自的解决方案,我无法测试,因为我目前没有mac

解决方案1:首先使用OSAScript运行命令 解决方案2:使用OSAScript提示输入密码,并与sudo一起使用
如果正确使用
STPrivilegedTask
,那么脚本应该已经以root权限运行,因此在这种情况下实际上不需要
sudo
命令

您应该使用类似于:

sudo=
[[ $(id -u) != 0 ]] && sudo=sudo
$sudo <command that would need sudo>
sudo=
[[$(id-u)!=0]&&sudo=sudo
$sudo

这应该可以防止关于没有tty的错误,这与在GUI应用程序中调用
sudo
命令有关。

如果正确使用
STPrivilegedTask
,那么脚本应该已经以root权限运行,因此在这种情况下实际上不需要
sudo
命令

您应该使用类似于:

sudo=
[[ $(id -u) != 0 ]] && sudo=sudo
$sudo <command that would need sudo>
sudo=
[[$(id-u)!=0]&&sudo=sudo
$sudo

这应该可以防止关于没有tty的错误,这与在GUI应用程序中调用
sudo
命令有关。

您是否将脚本的权限设置为可执行?请在保存脚本的文件夹中尝试
chmod+x script.sh
。谢谢您的回答。我解决了这个问题。它运行脚本。但现在我在控制台中收到一个错误:“sudo:no tty present and no askpass program specified sudo:no tty present and no askpass program specified”这是因为
sudo
必须要求您输入密码才能切换到根帐户,并且它需要一个交互式提示(
tty
)或者一个程序来完成。您是否将脚本的权限设置为可执行?请在保存脚本的文件夹中尝试
chmod+x script.sh
。谢谢您的回答。我解决了这个问题。它运行脚本。但现在我在控制台中收到一个错误:“sudo:no tty present and no askpass program specified sudo:no tty present and no askpass program specified”这是因为
sudo
必须要求您输入密码才能切换到根帐户,并且它需要一个交互式提示(
tty
)或者一个程序来完成。我不知道
STPrivilegedTask
,这可能是“更正确”的答案,我的答案更像是黑客。我不知道
STPrivilegedTask
,这可能是“更正确”的答案,我的答案更像是黑客。
sudo=
[[ $(id -u) != 0 ]] && sudo=sudo
$sudo <command that would need sudo>