Как создается файл / etc / passwd?

Несбалансированные кавычки

То, что вы имеете, - это беспорядочный пример несбалансированных кавычек.

Каждая пара одинарных и двойных кавычек должна быть сбалансирована, то есть всякий раз, когда у вас есть открывающая кавычка, у вас должна быть закрывающая кавычка позже в том же выражении, и они должны быть правильно вложены. (Так, например, echo "foo 'bar' baz" допустимо, а echo "foo 'bar baz" - нет.

Таким образом, в вашем случае sh (или любой другой Bourne shell, который вы используете) интерпретирует кавычки как сбалансированные, что приводит к тому, что "цитируются" части вашего сценария, которые вы не планировали, а именно, большая часть конструкции if ... else ... fi.

Еще один (сокращенный) пример из вашего сценария: su "psql -d "Dhruva" blah.sql". В этом примере строка Dhruva фактически находится вне кавычек, что, вероятно, не то, что вы хотели.

По сути, ваша проблема заключается в несбалансированных кавычках. Я проанализирую ваш скрипт немного подробнее, чтобы понять, что вы пытаетесь сделать, и предложу исправленную версию, но, признаюсь, я не совсем понимаю ваши намерения по поводу скрипта.

"Исправленный" скрипт

Я заключил слово "исправленный" в пугающие кавычки, потому что, хотя я могу сказать вам, как исправить синтаксис вашего скрипта, у меня все еще есть сомнения, которые я перечислю в конце этого ответа.

Немного рефакторинга и исправление кавычек

Во-первых, у вас есть несколько очень длинных строк, содержащих повторяющиеся элементы, которые можно легко рефакторить, что уже значительно облегчает нашу работу по "исправлению":

#!/bin/sh

cd /home/NorthStar/Dhruva/server-specific-scripts/crons/ResetETA

db="Dhruva"
file="/home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql"
cmd="psql -d $db -f $file"

su postgres -c "$cmd" >> reset.log 2> reset.log

if su postgres -c "$cmd"; then 
    printf su postgres -c "$cmd" >> resset.log
else
    printf su postgres -c "$cmd" >> reset_error.log
fi

Хотя вышеприведенный синтаксис теперь правильный, у меня есть несколько оставшихся вопросов:

  • Есть ли необходимость выполнять $cmd так много раз? Меняется ли результат (т.е. имеет ли запрос побочные эффекты?) Или вы можете сохранять результаты и добавлять их в журналы отдельно?
  • Является ли resset.log опечаткой, или у вас действительно три разных журнала?
  • printf ... не сделает того, что вы (вероятно) хотите, вот. printfпервым аргументом является строка формата (в данном случае, "su"), поэтому он выведет su.
6
19.09.2018, 23:27
3 ответа

Для Ubuntu и Debian пакетbase-passwdразвертывает не упакованный файл, поэтому запуск dpkg -Lне работает, а генерирует файл из сценария предварительной установки -/var/lib/dpkg/info/base-passwd.preinst

Для моих RHEL и CentOS эквивалент rpm -qf /etc/passwdдействительно показывает пакет, «владеющий» этим файлом, пакет setupRPM.

8
27.01.2020, 20:25

Linux с нуля вы сами создаете этот файл. Я бы предположил, что дистрибутивы начинаются с базового файла, а затем добавляют пользователей и службы, которые вы выбираете во время установки, на лету. Похоже, единственное правило, которому они хотят, чтобы вы следовали, это то, что root имеет uid и gid 0, а bin имеет 1. Похоже, что все остальное произвольно.

0
27.01.2020, 20:25

В случае встраиваемых систем он создается в buildroot/mkimage и т. д.

В пользовательских/маленьких дистрибутивах его создает администратор.

В некоторых дистрибутивах для настольных компьютеров/серверов он создается с помощью пакета, такого как «файловая система» в Arch Linux или «setup» в Fedora.

В Ubuntu или Debian это часть сценария предварительной -установки. Базовый пакет -passwd содержит утилиту обновления -passwd.

0
27.01.2020, 20:25

Теги

Похожие вопросы