A bash script, чтобы изменить пароль пользователя postgresql

Я могу изменить пароль пользователя postgresql таким образом (2 шага):

$ su - postgres -c 'psql -U postgres -d postgres'
# Alter user postgres with password 'password';

Теперь я хочу использовать одну строку (1 шаг), чтобы изменить пароль, например:

su - postgres -c 'psql -U postgres -d postgres -c "alter user postgres with password ''password'';"'

Я слышал использование двойной одинарной кавычки, чтобы избежать одной отдельной цитаты, поэтому я добавил двойную кавычку '. Однако отображается сообщение об ошибке:

ERROR:  syntax error at or near "password"
LINE 1: alter user postgres with password password;

Может ли кто-нибудь дать мне знать, как использовать одну строку команды для этого?

Ответы

Ответ 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 проще, заключается в том, что он использует более умный способ выполнения подпроцесса вместо запуска второго экземпляра оболочки для его выполнения. Вам нужен еще один слой метасимвола оболочки.