我不确定我是否应该在这里,在 Unix 上问论坛或其他完全不同的地方,但我们开始吧。
我正在使用 Packer为 AWS 和 GCE 创建一组图像(运行 Debian 8),在此过程中我想安装 HAProxy并为其设置一个配置文件。镜像构建和包安装进行得很顺利,但是当我尝试创建配置文件或覆盖现有配置文件时遇到文件权限问题。
我的 Packer Shell Provisioner 以用户 admin
的身份运行一组脚本(据我所知,我无法使用 root
通过 SSH 进入此设置),其中我遇到问题的那个看起来像这样:
#!/bin/bash
# Install HAProxy
sudo apt-get update
sudo apt-get install -y haproxy
# Create backup of default config file
sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
# Write content over to new config file
OLDIFS=$IFS
IFS=''
sudo cat << EOF > /etc/haproxy/haproxy.cfg
# Content line 1
# Content line 2
# (...)
EOF
IFS=$OLDIFS
日志输出给我这个错误:/tmp/script_6508.sh: line 17:/etc/haproxy/haproxy.cfg: Permission denied
我也考虑过将预制配置文件移到新创建的镜像中,但我不确定该怎么做。如果没有写入权限,那也行不通,对吗?
那么,有谁知道如何设置我的 Shell 脚本来解决这个问题?或者是否有其他可行的解决方案?
最佳答案
脚本的问题是行
sudo cat << EOF > /etc/haproxy/haproxy.cfg
重定向到/etc/haproxy/haproxy.cfg
发生在 sudo
之前被调用,因此要求运行脚本的任何用户都可以创建和写入文件。
您更改该文件的权限和所有权的想法通过使运行脚本的用户可写该文件来解决此问题,但实际上,您似乎将脚本的每一行都执行为 root
无论如何,为什么不放弃所有的sudo
呢? s 完全并将整个事情运行为 root
?
$ sudo myscript.sh # executed by the 'admin' user
编辑:由于这个脚本不是在目标机器上手动运行的,所以有两种解决方案:
- 使用
chmod
解决方案。 - 将配置文件写入一个临时文件并用
sudo
移动它.
第二种解决方案涉及更改线路
sudo cat << EOF > /etc/haproxy/haproxy.cfg
到
cat <<EOF >/tmp/haproxy.cfg.tmp
然后在 EOF
之后再往下
sudo cp /tmp/haproxy.cfg.tmp /etc/haproxy/haproxy.cfg
rm -f /tmp/haproxy.cfg.tmp
这可以说比乱用文件权限“更干净”。
关于linux - Shell 在创建配置文件时提示文件权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37877582/