使用 sed 插入或附加功能进行 ubuntu 自动安装

使用 sed 插入或附加功能进行 ubuntu 自动安装

我在我的 ubuntu 自动安装中使用以下命令在我的文件late-commands中添加一行:/etc/aliases

sed -i -e '/^postmaster:.*/i\'$'root:           root' /target/etc/aliases

我也尝试了不符合 POSIX 的版本:

sed -i '/^postmaster:.*/i root:           root' /target/etc/aliases

安装时结果相同:

finish: subiquity/Late/load_autoinstall_data: {"sed -i -e '/^postmaster:.*/i\\'$'root": "root' /target/etc/aliases"} is not of type 'string', 'array'

我想我理解了这个问题:列空间被 yaml 或其他东西解释为 yaml 条目。至少在我看来,这条消息导致了这个问题。

我认为既然late-commands已经是多行命令,这不会有什么问题。

我也尝试使用双引号代替单引号。

知道如何实现想要的行为吗?

答案1

我认为由于后期命令已经是多行命令,所以这不会有任何问题。

您为什么会这么想?听起来您好像在使用单行 YAML,并认为它的行为会像多行 YAML 一样。

我能够毫无错误地使用此 YAML 多行语法

#cloud-config
autoinstall:
  late-commands:
    - |
      sed -i '/^postmaster:.*/i root:           root' /target/etc/aliases
      true

true我在命令末尾使用,这样如果sed以非零返回代码退出,则它不会阻止安装程序继续运行。例如,如果/target/etc/aliases不存在。

也可以看看

笔记

美元符号确实存在一些语法/转义问题。当我尝试此配置时

#cloud-config
autoinstall:
  late-commands:
    - |
      cat <<EOF > /run/aliases
      postmaster:root
      EOF
      sed -i -e '/^postmaster:.*/i\'$'root:           root' /run/aliases
      sed -i '/^postmaster:.*/i root:           root' /run/aliases
      true

生成的/run/aliases文件内容为

$root:           root
root:           root
postmaster:root

我使用 Ubuntu 22.04 进行了测试(subiquity 22.04.2

相关内容