Ответ 1
Легче, если вы используете sudo
:
sudo -u postgres psql -U postgres -d postgres -c "alter user postgres with password 'password';"
но это возможно и для su, это должно работать:
su - postgres -c "psql -U postgres -d postgres -c \"alter user postgres with password 'password';\""
Я использовал внешние двойные кавычки и избежал внутренних двойных кавычек, поэтому они проходят через часть одного аргумента вызова в su
и получают unescaped оболочкой, поэтому фактический текст запроса передается как один аргумент в psql включая одноразовый пароль.
Одна из причин, по которой sudo проще, заключается в том, что он использует более умный способ выполнения подпроцесса вместо запуска второго экземпляра оболочки для его выполнения. Вам нужен еще один слой метасимвола оболочки.