我在其他分区上有各种其他 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 中发生,并正确保留所有参数?
只需执行脚本并像在脚本中一样传递参数即可:
sudo chroot --userspec="$(id -u):$(id -g)" "$1" \
sh -c 'cd "$1" && shift && exec "$@"' -- "$(pwd)" "$@"
备注:
$(...)
而不是反引号\"
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)"`