Как избежать "su -c 'psql ... -c \" \ "'" с зарезервированными словами - PullRequest
0 голосов
/ 19 июня 2019

Зарезервированное слово 'user' является проблемой для меня, потому что оно должно быть экранировано с помощью "" (двойные кавычки), но с комбинацией различных кавычек ('и "and \' и" /) psql передает его как пользователь(без двойного побега).Как убрать это специальное слово?

Я уже пробовал использовать $$ (строковые константы в кавычках) или помещать его в разные переменные, но ничего не помогает.

DB=mydb

MAIL_USER=my@mail.de
MAIL_PASS=password
MAIL_SERVER=mail.server.de
MAIL_PORT_IMAP=993
MAIL_PORT_SMTP=465

su -c "psql -d $DB -c \"INSERT INTO fetchmail_server(name, \"user\", type, server, port, is_ssl, password, active, priority, state, original) SELECT '$MAIL_USER', '$MAIL_USER', 'imap', '$MAIL_SERVER', $MAIL_PORT_IMAP, True, '$MAIL_PASS', True, 1, 'done', True WHERE NOT EXISTS (SELECT 1 FROM fetchmail_server WHERE name='$MAIL_USER')\"" postgres

Ожидаетсяв результате эта команда будет выполнена в базе данных

INSERT INTO fetchmail_server(name, "user", type, server, port, is_ssl, password, active, priority, state, original) SELECT 'my@mail.de', 'my@mail.de', 'imap', 'mail.server.de', 993, True, 'password', True, 1, 'done', True WHERE NOT EXISTS (SELECT 1 FROM fetchmail_server WHERE name='my@mail.de')

1 Ответ

0 голосов
/ 21 июня 2019

Спасибо @wildplasser, ваш намек на использование psql с нужным пользователем был верным.Так что мне удалось снизить уровень вложенности.Это работает:

SQL_COMMAND='INSERT INTO fetchmail_server(name, "user", type, server, port, is_ssl, password, active, priority, state, "original") SELECT '\'$MAIL_USER\'', '\'$MAIL_USER\'', '\'imap\'', '\'$MAIL_SERVER\'', '\'$MAIL_PORT_IMAP\'', True, '\'$MAIL_PASS\'', True, 1, '\'done\'', True WHERE NOT EXISTS (SELECT 1 FROM fetchmail_server WHERE name='\'$MAIL_USER\'')'
echo $SQL_COMMAND
psql -d $DB -U postgres -c "$SQL_COMMAND"
...