如何让 chroot 在新 rootfs 中与我现在所在的同一目录中运行命令?

问题描述 投票:0回答:1

我在其他分区上有各种其他 Linux 发行版,并且正在尝试编写一个名为“on”的命令,该命令将以相同的用户身份在该发行版中运行 shell 命令,并且在某种程度上与我在主机文件系统上所在的目录相同保留包含空格或通配符的参数。

我已经做到了

#! /bin/sh
# on: Run a command as the same user in the same directory inside a chroot
# Usage: on directory command [args]
chrootdir="$1"
shift
sudo chroot --userspec="`whoami`" "$chrootdir" sh -c "cd \"`pwd`\" && $@"

它将作为同一目录中的同一用户运行它,但如果参数(或命令名称!)中有空格,则会失败。

一个解决方案是 cd-ing 包装脚本:

#! /bin/sh
# Run a command in a specified directory
# Usage: runin dir command [args]
cd "$1" && shift && cmd="$2" && shift && exec "$cmd" "$@"

呼叫者

#! /bin/sh
# on: Run a command as the same user in the same directory inside a chroot
# Usage: on directory command [args]
chrootdir="$1"
shift
sudo chroot --userspec="`whoami`" "$chrootdir" runin "`pwd`" "$@"

但是包装器必须存在于所有 chroot 环境中,这很无聊。

有没有办法在主机系统上发出单个命令,使“cd”在 chroot 中发生,并正确保留所有参数?

shell variables quoting chroot
1个回答
0
投票

只需执行脚本并像在脚本中一样传递参数即可:

sudo chroot --userspec="$(id -u):$(id -g)" "$1" \
     sh -c 'cd "$1" && shift && exec "$@"' -- "$(pwd)" "$@"

备注:

  • sudo 在脚本中很奇怪
  • 我不认为 whoami 是 POSIX 中的。我认为 id 更便携。
  • 优先使用
    $(...)
    而不是反引号
  • 不要引用自己
    \"
    pwd"
    . If you want to quote something, use 
    printf "%q"
    . In this case, pass as parameter and properly quote inside subshell 
    sh -c 'echo "$1"' -- "$(pwd)"`
© www.soinside.com 2019 - 2024. All rights reserved.