pg_dump не будет работать через PHP
Этот вопрос был рассмотрен в других постах, но, похоже, они мне не помогли.
Моя проблема в том, что я запускаю следующий скрипт из терминала, pg_dump
Заявление работает:
$strBK = '/usr/bin/pg_dump --host localhost --port 5432 --username "postgres" --role "mizk" --no-password --format plain --data-only --inserts --column-inserts --verbose --file "/home/khalid/tmp/esm/x1" --table "public.\"tblCustomerCategories\"" --table "public.\"tblSellers\"" "dbESM" 2>&1';
//User has submitted form. Start making backup.
echo "ok " . shell_exec($strBK);
Но из php я получаю следующую ошибку:
ok pg_dump: [archiver (db)] connection to database "dbESM" failed:
fe_sendauth: no password supplied
pg_dump: *** aborted because of error
Как показано, я не спрашиваю пароль, но скрипт сообщает об ошибке аутентификации.
Я предполагаю, что PHP работает под www-data
в то время как дамп терминала работает как пользователь компьютера. Итак, как мне решить эту проблему безопасным способом?
1 ответ
Вы можете проверить свою теорию (www-data
не могу запустить команду), запустив:
sudo -iu www-data /usr/bin/pg_dump ...
Это, вероятно, является проблемой, и существует ряд различных обходных путей с различными последствиями безопасности.
Создайте скрипт, который запускает ваш дамп, принадлежащий вашему пользователю, с применением setuid (
chmod 4755 <filename>
). Кто бы ни запускал это, он запустит его как владельца файла. Существуют очевидные последствия для безопасности, если ваш скрипт также редактируется с помощью PHP, или ваш скрипт каким-то образом эксплуатируется.Используйте посредника. Вы можете писать в файл из PHP и читать его из задания cron (работающего от имени нужного пользователя). Если файл существует, он запускает ваш дамп и удаляет файл. Это довольно безопасно, но, очевидно, только мгновенно, как ваш интервал cron. Альтернативы включают в себя такие вещи, как Celery, который является немного более индустриальным для пакетирования или отложенных задач, опционально для других пользователей.
Бить Постгрес в разрешении
www-data
получить доступ к данным. Я бы предложил сделать это с помощью пароля, но это все еще позволит взломатьwww-data
доступ ко всему, что вы даете.
pg_dump
Команда также может иметь некоторые особенности. В SE есть несколько тем, которые могут помочь с этим конкретно: