Shell在创建配置文件时抱怨文件权限

时间:2016-06-17 09:11:56

标签: linux shell ssh file-permissions packer

我不能完全确定我是否应该在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脚本来解决这个问题?或者,如果还有其他可行的解决方案?

3 个答案:

答案 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

编辑:由于此脚本未在目标计算机上手动运行,因此有两种解决方案:

  1. 使用chmod解决方案。
  2. 将配置文件写入临时文件,并使用sudo移动它。
  3. 第二个解决方案涉及更改行

    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

我现在拥有设置工作所需的权限和所有权。

修改

其他用户提供了更好,更可行的解决方案,并回答了我的脚本中的一些问题。