如何在实例中运行命令

Incus 允许使用 Incus 客户端在实例内部运行命令,而无需通过网络访问实例。

对于容器,这始终有效,并由 Incus 直接处理。对于虚拟机,必须在虚拟机内部运行 incus-agent 进程才能使其工作。

要在实例内部运行命令,请使用 incus exec 命令。通过运行 shell 命令(例如,/bin/bash),您可以获取对实例的 shell 访问权限。

在实例内部运行命令

要从主机终端运行单个命令,请使用 incus exec 命令

incus exec <instance_name> -- <command>

例如,输入以下命令以更新容器上的软件包列表

incus exec ubuntu-container -- apt-get update

执行模式

Incus 可以以交互式或非交互式方式执行命令。

在交互模式下,伪终端设备 (PTS) 用于处理输入 (stdin) 和输出 (stdout、stderr)。如果连接到终端模拟器(而不是从脚本运行),CLI 会自动选择此模式。要强制使用交互模式,请向命令添加 --force-interactive--mode interactive

在非交互模式下,将分配管道(每个 stdin、stdout 和 stderr 一个)。此方法允许运行命令并根据许多脚本的要求正确获取单独的 stdin、stdout 和 stderr。要强制使用非交互模式,请向命令添加 --force-noninteractive--mode non-interactive

用户、组和工作目录

Incus 有一项策略,即不读取实例中的数据或信任可以在实例中找到的任何内容。因此,Incus 不会解析 /etc/passwd/etc/group/etc/nsswitch.conf 等文件来处理用户和组解析。

因此,Incus 不知道用户的 home 目录或用户所属的补充组。

默认情况下,Incus 以 root(UID 0)身份运行命令,使用默认组(GID 0),并将工作目录设置为 /root。您可以通过以下标志指定绝对值来覆盖用户、组和工作目录

  • --user - 运行命令的用户 ID

  • --group - 运行命令的组 ID

  • --cwd - 命令应运行的目录

环境

您可以通过以下两种方式将环境变量传递到 exec 会话

将环境变量设置为实例选项

要在实例中将 ENVVAR 环境变量设置为 VALUE,请设置 environment.ENVVAR 实例选项(请参阅 environment.*

incus config set <instance_name> environment.ENVVAR=VALUE
将环境变量传递到 exec 命令

要将环境变量传递到 exec 命令,请使用 --env 标志。例如

incus exec <instance_name> --env ENVVAR=VALUE -- <command>

此外,Incus 设置以下默认值(除非它们以上述方式之一传递)

变量名称

条件

PATH

-

的连接

  • /usr/local/sbin

  • /usr/local/bin

  • /usr/sbin

  • /usr/bin

  • /sbin

  • /bin

  • /snap(如果适用)

  • /etc/NIXOS(如果适用)

LANG

-

C.UTF-8

HOME

以 root(UID 0)身份运行

/root

USER

以 root(UID 0)身份运行

root

获取对实例的 shell 访问权限

如果您想直接在实例中运行命令,请在其中运行 shell 命令。例如,输入以下命令(假设您的实例中存在 /bin/bash 命令)

incus exec <instance_name> -- /bin/bash

默认情况下,您以 root 用户身份登录。如果您想以其他用户身份登录,请输入以下命令

incus exec <instance_name> -- su --login <user_name>

注意

根据您在实例中运行的操作系统,您可能需要先创建一个用户。

要退出实例 shell,请输入 exit 或按 Ctrl+d