我不能完全确定我是否应该在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脚本来解决这个问题?或者,如果还有其他可行的解决方案?
答案 0 :(得分:2)
脚本的问题是
行sudo cat << EOF > /etc/haproxy/haproxy.cfg
在调用/etc/haproxy/haproxy.cfg
之前重定向到sudo
,因此要求运行该脚本的任何用户都可以创建和写入该文件。
您更改该文件的权限和所有权的想法通过使运行该脚本的用户可以写入文件来解决此问题,但实际上,您似乎正在执行脚本中的每一行root
无论如何,那么为什么不完全放弃所有sudo
并将整个事件作为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
这可以说比清理文件权限更“干净”。
答案 1 :(得分:2)
正如Kusalananda指出的那样,问题是输出重定向发生在调用sudo
的shell中。
在这种情况下,我通常会使用这个简单的技巧:
TMPFILE=`tempfile`
cat << EOF > $TMPFILE
# Content line 1
# Content line 2
# (...)
EOF
sudo cp $TMPFILE /etc/haproxy/haproxy.cfg
rm $TMPFILE
我创建了一个临时文件并将内容放在那里(该步骤不需要sudo)。然后使用sudo,将临时文件复制到最终目标。最后:删除临时文件。 (我使用副本使文件所有权属于root;移动将保留调用用户的用户/组。或者,可以使用chmod
/ chown
来修复权限。)
答案 2 :(得分:0)
解决方法很简单,123 comment给了我正确答案:chown
通过更改此
sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
到这个
sudo chown admin /etc/haproxy/haproxy.cfg
sudo chmod 644 /etc/haproxy/haproxy.cfg
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
我现在拥有设置工作所需的权限和所有权。
修改强>
其他用户提供了更好,更可行的解决方案,并回答了我的脚本中的一些问题。