Подтвердить что ты не робот

Могу ли я переключить пользователя в брандмауэр-бутстрап-оболочку 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.)

4b9b3361

Ответ 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.