是否可以通过 snap 包在主机上执行命令?

是否可以通过 snap 包在主机上执行命令?

我正在构建 snap from 命令行程序,以便从自然语言中猜测 Linux 命令。例如calshow 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 应用程序在主机上执行程序的权限吗?

我正在检查接口但未发现与访问主机程序相关的任何内容。

snapcraft.yaml


更新

我找到了解决方案:

首先我需要process-control

apps:
  gpt-cli:
    command: gpt-cli
    plugs:
      - process-control
      - network
      - network-bind

confinement: classic

答案1

经典监禁(https://snapcraft.io/docs/classic-confinement)可以实现这一点,但并不容易经典的定义的应用程序进入商店,前提是它们具有完全的系统访问权限。

经典限制是一种宽松的 Snap 限制级别,相当于传统打包应用程序所具有的完全系统访问权限。

它通常被用作一种权宜之计,使开发人员能够发布需要比当前接口和权限允许的更多访问权限的应用程序。

相关内容