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