Swift macOS应用程序:无法在/usr/local/bin中运行可执行文件 上下文
我试着编写一个macOS Swift应用程序,在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
/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
的尝试会失败?
- 我怀疑这与安全沙箱有关
/usr/local/bin
中的可执行文件?
- 如果禁用系统完整性保护之类的安全措施,或许是可能的——其他方法将是理想的
- 一个想法是(a)创建一个可以调用二进制文件的服务器,(b)将应用程序更改为向服务器发送请求的客户端。我想知道是否还有更轻量级的解决方案
生成设置>签名>代码签名权限
为空:
主要问题是沙箱。如果这只是供您自己使用,您可以为此应用程序禁用沙盒。要执行此操作,请转到目标/生成设置/签名。从代码签名权限中删除权限文件的名称。谢谢!我在原来的帖子中添加了一个屏幕截图来演示修复。