Swift macOS应用程序:无法在/usr/local/bin中运行可执行文件 上下文

Swift macOS应用程序:无法在/usr/local/bin中运行可执行文件 上下文,swift,macos,Swift,Macos,我试着编写一个macOS Swift应用程序,在/usr/local/bin中启动一个可执行文件(例如,安装了Homebrew/usr/local/bin/cowsay) 但是,这不起作用,因为/usr/local/bin不在路径环境变量中 在应用程序中,我尝试通过setenv将/usr/local/bin添加到PATH,这似乎也不起作用 代码 这是一个使用Xcode 12.5 beta 3(12E5244e)的代码复制器: 导入基础 导入快捷键 func addPathComponentFNo

我试着编写一个macOS Swift应用程序,在
/usr/local/bin
中启动一个可执行文件(例如,安装了Homebrew
/usr/local/bin/cowsay

但是,这不起作用,因为
/usr/local/bin
不在
路径
环境变量中

在应用程序中,我尝试通过
setenv
/usr/local/bin
添加到
PATH
,这似乎也不起作用

代码 这是一个使用Xcode 12.5 beta 3(12E5244e)的代码复制器:

<代码>导入基础 导入快捷键 func addPathComponentFNotSet(\uPathComponent:String){ //如果路径中已存在路径组件,请返回。 让path=ProcessInfo.ProcessInfo.environment[“path”]! 让pathComponents=path.split(分隔符:“:”) 如果pathComponents.contains(子字符串(pathComponent)){ 返回 } //否则,请通过setenv将路径组件前置到路径。 let newPath=“\(路径组件):\(路径)” setenv(“路径”,新路径,1) //打印新路径。 打印(“实际新路径:”,ProcessInfo.ProcessInfo.environment[“PATH”]!) } @可丢弃结果 func shell(u参数:字符串…)->Int32{ 让任务=进程() task.launchPath=“/usr/bin/env” task.arguments=args task.launch() task.waitUntilExit() return task.terminationStatus } 结构DummyContentView:视图{ var body:一些观点{ 按钮(“按我”){ //如果路径不存在,则将“/usr/local/bin”添加到该路径。 //打印:“实际新路径:/usr/local/bin:/Applications/Xcode beta.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin” AddPathComponentFNotSet(“/usr/local/bin”) //测试:运行“ls”工作。 壳牌(“ls”) //错误1:在此处运行“cowsay”失败,并显示“env:cowsay:Operation not allowed”。 shell(“cowsay”,“测试这个”) //错误2:在此处运行“cowsay”失败,文件“cowsay”不存在。 让executableURL=URL(fileURLWithPath:“/usr/local/bin/cowsay”) 试试!Process.run( 可执行URL, 参数:[“也测试这个”], terminationHandler:nil) } } } 问题
  • 为什么调用
    /usr/local/bin/cowsay
    的尝试会失败?
    • 我怀疑这与安全沙箱有关
  • 在Swift macOS应用程序中,是否可以调用
    /usr/local/bin
    中的可执行文件?
    • 如果禁用系统完整性保护之类的安全措施,或许是可能的——其他方法将是理想的
  • 我如何调整应用程序以实现调用本地自制二进制文件的目标?
    • 一个想法是(a)创建一个可以调用二进制文件的服务器,(b)将应用程序更改为向服务器发送请求的客户端。我想知道是否还有更轻量级的解决方案
  • 认可的解决方案说明 为我工作。下面是一个屏幕截图,显示了修复程序–使
    生成设置>签名>代码签名权限
    为空:


    主要问题是沙箱。如果这只是供您自己使用,您可以为此应用程序禁用沙盒。要执行此操作,请转到目标/生成设置/签名。从代码签名权限中删除权限文件的名称。

    谢谢!我在原来的帖子中添加了一个屏幕截图来演示修复。