我们的 CI 服务器使用全部以 root 身份运行的 docker 镜像。现在我有一个无法以 root 身份运行的 Maven 构建,因此我尝试构建此包装器脚本来创建用户、从 root 复制 Maven 设置,然后运行脚本。
这是我所拥有的
#! /bin/bash -ex
useradd -m nonroot
cp -R /root/.m2 /home/nonroot/.m2
chown -R nonroot /home/nonroot/.m2
su nonroot -c "$@"
问题是:当我以 调用此脚本时./nonroot.sh mvn clean install
,它只执行mvn
,而不执行mvn clean install
。我该如何修复此问题?
答案1
注意,您sudo -u nonroot
通常可以使用来运行命令,但如果您需要使用,su
这里有一种方法可以传递命令和参数而不会丢失空格等:
su nonroot -c '"$@"' dummy "$@"
这利用了 bash 接受参数的方式-c
并使用它们来设置$1
等。例如:
bash -c 'echo $*' 1 2 3
结果输出为2 3
,因为第一个参数被视为程序名。所以我们让 bash 运行命令"$@"
,然后传递真正的参数。