Могу ли я переключить пользователя в брандмауэр-бутстрап-оболочку script?
Изменить. По-видимому, проблема заключалась в том, что я должен был сделать
su - postgres -c "commands, commands, commands"
,
то есть передавать любые команды su
, а не пытаться перечислить их ниже su
, так как эти команды (ниже su
) не подвержены влиянию su
. /Edit
Изменить 2: См. ответ Дэвида Брауна для еще лучшего решения: qaru.site/info/201558/...
Могу ли я не переключать пользователя (su - postgres
) в резервную оболочку брандмауэра script? (Почему бы и нет?)
Я пишу такой script. В этом script я делаю:
echo '===== Creating PostgreSQL databases and users'
su - postgres
psql -c "
create user SomeUserName password '...';
alter user ...;
"
Здесь psql
должен попытаться войти в систему как пользователь postgres
. Однако происходит то, что su - postgres
, по-видимому, не работает, и оболочка пытается войти в систему как пользователь root. (По-видимому, root - это пользователь, который запускает брандмауэр-бутстрап-оболочку script.)
Итак, эта ошибка появляется, и команды psql не вызываются:
psql: FATAL: роль "root" не существует
Замена su - postgres
на sudo su - postgres
не имеет эффекта (я думаю, что script уже запущен как root.)
Я добавил id
(который печатает текущий идентификатор пользователя) до и после su - postgres
, а id
печатает uid=0(root) gid=0(root) groups=0(root)
как до, так и после su
. Насколько я могу судить, su - postgres
игнорируется? И некий exit
, а затем, когда я пытаюсь вернуться к пользователю root, полностью завершает загрузку script: - (
Однако. После выполнения vagrant ssh
я могу sudo su - postgres
просто отлично, а затем запустите psql
. Но не из обеспечения script.
(Обходной путь заключается в том, чтобы указать -h 127.0.0.1 --username postgres
, когда я вызываю psql
(вместо того, чтобы переключать пользователя на postgres), а также включить проверку подлинности на основе доверенности PostgreSQL для локальных подключений VM.)
Ответы
Ответ 1
Я не уверен, что вы можете переключать пользователей в сценарии оболочки Vagrant, поскольку для этого может потребоваться ввод пользователя, который вы не можете дать, когда script запущен в устройстве создания... но почему бы просто не указать пользователя с помощью Команда psql?
psql --username=postgres -c "..."
Ответ 2
echo '===== Creating PostgreSQL databases and users'
su postgres << EOF
psql -c "
create user SomeUserName password '...';
alter user ...;
"
EOF
Ответ 3
Я просто нашел это, ища способ запустить сценарии поставщика Vagrant как non-root, и хотел бы добавить объяснение наблюдаемого поведения, что является весьма фундаментальным знанием Unix, которое было бы полезно для читателей.
Запуск программы (например,/bin/sh, sudo или su) в оболочке script не может ничего изменить в контексте (рабочий каталог, запущенный пользователь и т.д.), в котором он выполняется, только установить контекст для процесса он создает (и только меняет текущий uid, если он работает как root - uid 0). Вот почему cd - встроенная команда в оболочках. su является программой setuid (обратите внимание на "s" при попытке выполнить команду "ls -l which su
" ), что означает, что она будет выполняться как пользователь, владеющий программой (root), а не как пользователь, выполняющий ее.
Ответ 4
LHP прав: на самом деле это не бродячая проблема. Мне нужно было это сделать некоторое время назад, и вот как я его решил:
#!/bin/bash
case $(id -u) in
0)
echo first: running as root
echo doing the root tasks...
sudo -u vagrant -i $0 # script calling itself as the vagrant user
;;
*)
echo then: running as vagrant user
echo doing the vagrant user tasks
;;
esac
Возможно, это может быть полезно для кого-то, но другое очевидное решение будет просто запускать второй script с помощью sudo.
ФИКСИРОВАН: Спасибо, Макатак. Я написал непосредственно в stackoverflow и еще не тестировался.
EDIT: вопрос был отредактирован, и теперь его описание и большинство ответов сосредоточены на "Как создать базу данных postgres с нужным пользователем", а не на том, как переключить пользователя в бродягу script.