pg_dump не запускается через PHP

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-job (запущенного как правильный пользователь). Если файл существует, он запускает ваш дамп и удаляет файл. Это довольно безопасно, но очевидно, что это происходит только так же мгновенно, как ваш cron-интервал. Альтернативы включают такие вещи, какСельдерейчто немного более удобно для пакетной обработки или отсрочки задач, при необходимости, другим пользователям.

  • Превзойти Postgres, предоставив www-dataдоступ к данным. Я бы предложил сделать это через пароль, но это все равно позволит взломать www-dataдоступ ко всему, что вы ему предоставите.

Команда pg_dumpтакже может иметь некоторые особенности. Есть несколько тем вокруг SE, ​​которые могут помочь конкретно с этим:

Связанный контент