Изменить. По-видимому, проблема заключалась в том, что я должен был сделать
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.)