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

Dan Zheng

上下文

我尝试编写一个 macOS Swift 应用程序,它在/usr/local/bin(例如 Homebrew-installed /usr/local/bin/cowsay中启动一个可执行文件

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

在应用程序中,我尝试添加/usr/local/binPATHvia setenv,这似乎也不起作用。

代码

这是带有 Xcode 12.5 beta 3 (12E5244e) 的代码复制器:

import Foundation
import SwiftUI

func addPathComponentIfNotSet(_ pathComponent: String) {
  // If path component already exists in PATH, return.
  let path = ProcessInfo.processInfo.environment["PATH"]!
  let pathComponents = path.split(separator: ":")
  if pathComponents.contains(Substring(pathComponent)) {
    return
  }
  // Otherwise, prepend path component to PATH via setenv.
  let newPath = "\(pathComponent):\(path)"
  setenv("PATH", newPath, 1)
  // Print new PATH.
  print("Actual new PATH:", ProcessInfo.processInfo.environment["PATH"]!)
}

@discardableResult
func shell(_ args: String...) -> Int32 {
  let task = Process()
  task.launchPath = "/usr/bin/env"
  task.arguments = args
  task.launch()
  task.waitUntilExit()
  return task.terminationStatus
}

struct DummyContentView: View {
  var body: some View {
    Button("Press me") {
      // Add "/usr/local/bin" to PATH if it doesn't exist.
      // Prints: "Actual new PATH: /usr/local/bin:/Applications/Xcode-beta.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
      addPathComponentIfNotSet("/usr/local/bin")

      // Test: running "ls" works.
      shell("ls")

      // Error 1: running "cowsay" here fails with "env: cowsay: Operation not permitted".
      shell("cowsay", "Test this")

      // Error 2: running "cowsay" here fails with "The file “cowsay” doesn’t exist".
      let executableURL = URL(fileURLWithPath: "/usr/local/bin/cowsay")
      try! Process.run(
        executableURL,
        arguments: ["Test this too"],
        terminationHandler: nil)
    }
  }
}

问题

  1. 为什么尝试调用/usr/local/bin/cowsay会失败?
    • 我怀疑它与安全沙盒有关。
  2. 在 Swift macOS 应用程序中,是否可以调用其中的可执行文件/usr/local/bin
    • 如果禁用系统完整性保护等安全措施,也许是可能的 - 其他方法将是理想的。
  3. 如何调整应用程序以实现调用本地 Homebrew 安装的二进制文件的目标?
    • 一个想法是 (a) 创建一个可以调用二进制文件的服务器,以及 (b) 将应用程序更改为向服务器发送请求的客户端。我想知道是否有更多轻量级的解决方案。

接受的解决方案说明

比尔的解决方案对我有用。这是显示修复程序的屏幕截图 –Build Settings > Signing > Code Signing Entitlements清空:

修复:使代码签名权利为空

比尔

主要问题是沙箱。如果这仅供您自己使用,您可以为此应用程序禁用沙箱。为此,请转到目标/构建设置/签名。从代码签名权利中删除权利文件的名称。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将Windows .exe转换为macOS可执行文件/应用程序?

如何从终端用Swift编写的应用程序生成可执行文件?

MacOS Metal应用程序可在Obj-C中运行,无法进行Swift翻译

当捆绑可执行文件是 Bash 脚本时将参数传递给 macos 应用程序

如何在macOS上为Linux构建Swift可执行文件

如何运行可执行文件(应用程序/ x-可执行文件)?

gdb 8.2无法识别macOS Mojave 10.14上的可执行文件

MacOS:配置:错误:C编译器无法创建可执行文件

可执行文件包装程序,从PATH的末尾运行原始可执行文件

指定的任务可执行文件“ cmd.exe”无法运行。指定的可执行文件不是此OS平台的有效应用程序

Linux Fultter桌面-无法从已编译的可执行文件运行应用程序,无法正常运行

如何在Xcode中添加可以由Swift Package Manager运行的可执行文件?

如何在Swift可执行文件(如“ vi”)中运行和打印zsh命令

Xcode:可构建应用程序,但无法运行,并且无法在方案中选择可执行文件

安装的程序可执行文件从错误的位置运行

无法运行Nginx可执行文件

无法在挂载分区上运行可执行文件

无法在Linux上运行Pyinstaller可执行文件

使“解压”是最新的;可执行文件将无法运行

.JAR可执行文件无法正常运行

Docker运行无法找到可执行文件“ uwsgi”

可执行文件无法正常运行[Linux]

根本无法运行可执行文件

运行WPF应用程序的可执行文件时,log4net无法正常工作

如何从打包的Electron应用程序运行可执行文件

可执行文件是否在当前外壳程序或子外壳程序中“运行”?

从任务计划程序不在后台W7中运行可执行文件

如何从正在运行的程序中创建可执行文件(或JAR)?

尝试在C ++代码中运行C ++可执行文件会暂停程序