2016-06-17 8 views
0

Я не совсем уверен, могу ли я спросить здесь, на форумах Unix или где-то совсем другом, но здесь мы идем.Shell жалуется на права доступа к файлам при создании файла конфигурации

Я использую Packer для создания набора изображений (работает Debian 8) для AWS и GCE, и во время этого процесса я хочу установить HAProxy и настроить для него конфигурационный файл. Построение образа и установка пакета идут гладко, но у меня возникают проблемы с правами доступа к файлам, когда я пытаюсь либо создать файл конфигурации, либо перезаписать существующую.

My Packer Shell Provisioner запускает набор скриптов, как пользователь admin (насколько я знаю, что я не могу SSH в эту установку с root), где в качестве одного у меня возникают проблемы с внешностью, как это:

#!/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

Я также думал о имея Premade конфигурационный файл перешел к вновь созданному образу, но я не уверен, как это сделать. И это не сработает без письменного разрешения, верно?

Итак, кто-нибудь знает, как я могу настроить сценарий Shell, чтобы исправить это? Или, если есть еще одно жизнеспособное решение?

+0

Вы проверили кто владеет файлом? – 123

+0

@ 123 - Да, 'root' делает. Хотя я не уверен, почему, поскольку я зарегистрирован как 'admin', когда установлен HAProxy, и таким образом создается файл конфигурации папки/по умолчанию. – DoTheGenes

+0

Если вы не можете 'sudo' или использовать root, тогда нет ничего, что вы могли бы сделать в отношении этого файла. Я не использовал HAproxy, но вы, вероятно, можете вручную установить его и настроить другое расположение для конфигурации. – 123

ответ

2

Проблемы со сценарием является линией

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

Перенаправления к /etc/haproxy/haproxy.cfg происходит до sudo называются, и, таким образом, требует, чтобы файл может быть создан и записан в любом пользователе запущен скрипт.

Ваша идея изменения разрешений и прав собственности на этот файл решает эту проблему, создавая файл, доступный для записи пользователем, выполняющим скрипт, но на самом деле вы, кажется, выполняете каждую строку скрипта как root в любом случае, так почему бы не просто полностью удалить все sudo и запустить все это как root?

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

EDIT: Так как этот скрипт не запускается на целевом компьютере вручную, есть два решения:

  1. Go с 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 

Это, возможно, "чище", чем Мессинг вокруг с файлом permi ssions.

+0

Спасибо, это многое проясняет! Проблема с запуском скрипта как «root» заключается в том, что я не могу подключиться к этой машине как «root» через SSH и должен иметь привилегии «admin». (Вся настройка происходит через SSH.) – DoTheGenes

+0

@DoTheGenes Но у вас есть доступ к 'sudo', поэтому войдите в систему как' admin' и запустите скрипт как 'root' с' sudo', как я и предложил. – Kusalananda

+0

У меня создалось впечатление, что Пэкер запускал сценарии создания сценария как 'sudo' (но тогда зачем мне нужны другие' sudo', верно?), Поэтому я думал, что ваш ответ уже «был применен», так сказать. Во всяком случае, чтобы запустить мои скрипты как 'sudo', мне придется изменить параметр Packer' execute_command' на то, что даст мне 'sudo'. – DoTheGenes

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 

теперь у меня есть оба разрешения и права собственности, которые мне нужны для моей настройки.

EDIT

Другие пользователи обеспечили более и более эффективные решения, а также ответил на некоторые вопросы, вокруг моего сценария.

2

Как указал Кусалананда, проблема заключается в том, что перенаправление вывода происходит в оболочке, которая вызывает sudo.

В таких ситуациях я обычно использую этот простой трюк:

TMPFILE=`tempfile` 
cat <<EOF> $TMPFILE 
# Content line 1 
# Content line 2 
# (...) 
EOF 
sudo cp $TMPFILE /etc/haproxy/haproxy.cfg 
rm $TMPFILE 

я создаю временный файл и не положить содержание там (нет необходимости в Sudo для этого шага). И затем с помощью sudo скопируйте файл temp в конечный пункт назначения. Наконец: удалите временный файл. (Я использую копию, чтобы принадлежать файлу к корню, и перемещение будет содержать пользователя/группу вызывающего пользователя. В качестве альтернативы, для устранения разрешений можно использовать chmod/chown.)