您可以将所有这些逻辑抽象到更高级别的应用程序中。如果您不能这样做,请编写一个标准的 shell 脚本并将其 COPY 到您的映像中。
三重引号看起来像 Python 语法。您可以将其分为三个部分:
-
cd $dir 部分指定子进程的工作目录;
-
make ... 是实际运行的命令;
- 您正在检查其输出是否存在某种情况。
在 Python 中,您可以使用一组参数调用 subprocess.run(),并在应用程序级别指定这些不同的东西。 shell 不会重新解释参数数组,因此可以保护您免受此特定安全问题的影响。你可能会跑:
completed = subprocess.run(['make', 'image', dockerImageName],
cwd=dir,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
if 'No rule to make target' in completed.stdout:
...
如果您需要以 shell 脚本的形式执行此操作,请将其作为适当的 shell 脚本执行并确保再次引用您的参数可以保护您。
#!/bin/sh
set -e
cd "$1"
if make image "$2" 2>&1 | grep -m 1 "No rule to make target"; then
exit 1
fi
您永远不应该通过以您所展示的方式组合字符串来构建命令行。这使您容易受到 shell 注入攻击。特别是如果攻击者知道用户有运行docker命令的权限,他们可以设置
dir = '.; docker run --rm -v /:/host busybox cat /host/etc/shadow'
并获得一份他们可以在闲暇时破解的加密密码文件。一旦攻击者使用这种技术获得对主机文件系统的无限根级读/写访问权限,几乎任何其他事情都是可能的。