我正在构建 snap from 命令行程序,以便从自然语言中猜测 Linux 命令。例如cal
。show calendar
当命令被提出时,我需要通过来确认它们Enter
。因此,Enter
我希望cal
在我的主机系统上执行。
当程序在主机上本地执行时,它可以工作,这要归功于以下代码:
let mut child = Command::new(command_name)
.args(command_args)
.stdin(Stdio::inherit())
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.spawn()
.expect("Failed to execute command");
但是当我将此应用程序打包到snap
我看到的错误:
➜ gpt-cli show calendar
> Execute.:
cal
Yes
thread 'main' panicked at 'Failed to execute command: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/main.rs:126:26
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
我担心这cal
不可用snap container
并且我的程序无法访问主机上下文。
所以问题是:我可以授予 snap 应用程序在主机上执行程序的权限吗?
我正在检查接口但未发现与访问主机程序相关的任何内容。
更新
我找到了解决方案:
首先我需要process-control
apps:
gpt-cli:
command: gpt-cli
plugs:
- process-control
- network
- network-bind
和
confinement: classic
答案1
经典监禁(https://snapcraft.io/docs/classic-confinement)可以实现这一点,但并不容易经典的定义的应用程序进入商店,前提是它们具有完全的系统访问权限。
经典限制是一种宽松的 Snap 限制级别,相当于传统打包应用程序所具有的完全系统访问权限。
它通常被用作一种权宜之计,使开发人员能够发布需要比当前接口和权限允许的更多访问权限的应用程序。