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