Ubuntu 18에서 PHP를 사용하여 파일에 액세스하거나 파일을 복사할 수 없습니다

Ubuntu 18에서 PHP를 사용하여 파일에 액세스하거나 파일을 복사할 수 없습니다

저는 PHP API가 MySQL에서 CSV 내보내기를 생성하고 나중에 다운로드할 수 있는 파일을 제공하는 레거시 프로젝트를 처리해야 합니다.

문제는 API가 (Apache를 통해) 다운로드할 수 있는 디렉터리에 CSV 파일을 복사할 수 없다는 것입니다.

프로세스는 다음과 같습니다.

  1. 누군가 웹사이트의 버튼을 클릭하여 csv 내보내기를 생성합니다.
  2. API는 SQL 문을 생성하고 shell_exec(mysql ...);로 실행합니다.
  3. 데이터베이스는 데이터가 포함된 CSV 파일을 생성하여 /tmp/에 저장합니다.
  4. API는 파일을 Apache 전용 다운로드 디렉터리에 복사합니다.
  5. API는 버튼을 클릭한 사용자에게 다운로드 링크가 포함된 메일을 보냅니다.

위의 모든 작업은 4단계를 제외하고 작동합니다.

API에서 찾은 내용은 다음과 같습니다.

$exportCommand = "mysql ....";
// mysqlExportTmpDir = /tmp
// mysqlExportTargetDirectory = download directory for apache
$moveExportFileCommand = "cp ".$this->mysqlExportTmpDir."/$filename ".$this->mysqlExportTargetDirectory;
shell_exec("( $exportCommand; $moveExportFileCommand; $sendNotificationCommand) &");

MySQL 명령이 작동한다고 말했듯이 메일 알림은 작동하지만 cp 명령은 작동하지 않습니다.

로그를 살펴보면 다음 오류가 표시됩니다.

cp: '/tmp/610278f414d84.csv'를 stat할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

shell_exec("ls /tmp/*.csv");또한 이전 내보내기 파일이 API에 표시되는지 확인하려고 시도했지만 다음과 같은 결과가 나타납니다.

ls: '/tmp/*.csv'에 액세스할 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

거기에는 분명히 CSV 파일이 있습니다. 따라서 권한 문제일 수 있다고 생각하고 터미널에서 다음을 실행해 보았습니다 sudo -u www-data cp /tmp/610274ad5a8a5.csv /path/to/api/download. 로그에서 cp 명령을 복사했으므로 정확히 동일해야 합니다.

작동합니다. 이제 www-data가 Apache를 실행하고 shell_exec("whoami")를 사용하여 PHP API에서 www-data를 가져오기 때문에 혼란스럽습니다. 어쩌면 sudo -u www-data cp ...명령이 예상대로 작동하지 않을 수도 있습니다(해당 사용자와 동일한 권한이 있을 것으로 예상했습니다). 하지만 모르겠어요.

PHP가 /tmp의 csv 파일에 액세스할 수 없고 이를 다른 디렉토리에 복사할 수 없는 이유를 아는 사람이 있습니까?

대상 디렉터리는 www-data 그룹에 속하며 그 안에 있는 파일은 브라우저에서 다운로드할 수 있습니다.

데이터베이스에서 데이터를 내보내는 접근 방식이 이상하다는 것을 알고 있지만 1년 전까지만 해도 작동하는 것 같았습니다. 이제 우리 회사에는 이 프로젝트에 참여한 사람이 더 이상 없고 무엇이 바뀌었는지 모르겠습니다.

답변1

에 Apache용 개인 tmp 디렉토리가 있습니다 /tmp/*apache2.service*/tmp. 이는 .NET의 개인 tmp 설정으로 인해 존재합니다 /lib/systemd/system/apache2.service. 조금 찾았어요여기 기사.

PHP 스크립트를 호출할 때마다 copy(/tmp/....)Apache 특정 개인 tmp 디렉토리를 찾습니다. /tmp이 옵션이 활성화되면 Apache는 내용을 볼 수 없습니다 .

따라서 이 옵션을 비활성화하거나 MySQL이 CSV 파일을 다른 곳에 덤프하도록 할 수만 있습니다.

관련 정보