linux - Shell 在创建配置文件时提示文件权限

标签 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 脚本来解决这个问题?或者是否有其他可行的解决方案?

最佳答案

脚本的问题是行

sudo cat << EOF > /etc/haproxy/haproxy.cfg

重定向到/etc/haproxy/haproxy.cfg发生在 sudo 之前被调用,因此要求运行脚本的任何用户都可以创建和写入文件。

您更改该文件的权限和所有权的想法通过使运行脚本的用户可写该文件来解决此问题,但实际上,您似乎将脚本的每一行都执行为 root无论如何,为什么不放弃所有的sudo呢? s 完全并将整个事情运行为 root

$ sudo myscript.sh   # executed by the 'admin' user

编辑:由于这个脚本不是在目标机器上手动运行的,所以有两种解决方案:

  1. 使用 chmod解决方案。
  2. 将配置文件写入一个临时文件并用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/

相关文章:

php - Web本地应用程序Apache:运行Shell脚本

linux - 从 bash 脚本生成 bash 脚本

ssh - 错误启动 "XAMPP"堆栈 : cannot start stack: ssh not accessible

python - 为什么我一直收到 bin/sh : 1 : : not found

ruby-on-rails - rbenv 不能在 ubuntu 上使用 rbenv 和 ruby​​-build 工作吗?

linux - 如何在 Linux 中查看/打开 .sof 文件?

shell - ftp 用户名和密码在 shell 脚本中自动生成

node.js - 存储 SSH 登录凭据?

python - Paramiko 无法识别由 ssh-keygen 生成的 SSH key : "not a valid RSA private key file"

c++ - Popen 使 Qt 调试器崩溃