일반적으로 권한이 없는 사용자의 심볼릭 링크를 통해 PHP의 파일에 액세스합니다.

일반적으로 권한이 없는 사용자의 심볼릭 링크를 통해 PHP의 파일에 액세스합니다.

사용자가 양식을 제출하면 Python 스크립트가 PHP 페이지를 통해 실행되고 Python 스크립트가 zip 파일을 생성하여 링크를 통해 다운로드할 수 있도록 사용자에게 제공해야 하는 이 웹 사이트가 있습니다. 파일 크기가 매우 클 수 있습니다(몇 GB).

저는 대학 서버에서 작업하고 있기 때문에 해당 대학의 서버 규칙과 기능을 엄격하게 준수해야 합니다. 문제는 다음과 같습니다.

웹사이트는 /data/mywebsite디스크 공간이 제한된 에 저장되어 있습니다. 물론 이것은 www-data주로 내 Apache 서버에서 액세스할 수 있으므로 의 소유입니다.

에는 1TB 스토리지가 제공되는데 /experimentdata/, 이는 단일 특정 사용자만 액세스할 수 있습니다 theuser. 이는 이 폴더가 단일 특정 사용자 ID로 액세스할 수 있는 삼바 마운트이기 때문입니다.

에서 파일을 생성하기 위해 user 로 파일을 생성하는 명령을 /experimentdata사용합니다 . 이제 내 문제는: Apache를 통해 다운로드할 수 있는 링크를 통해 이 파일을 어떻게 제공할 수 있습니까?sudo -u theuser/experimentdata/downloadme.ziptheuser

예를 들어 /data/mywebsite/download/downloadme.zip. 문제는 사용자가 www-data파일을 읽을 수 있는 권한이 전혀 없다는 것입니다!

사용자가 사용자를 통해 /experimentdata/downloadme.zip사용자와 함께 파일을 다운로드하게 하려면 어떻게 해야 합니까 ?www-datatheuser

sudo -u theuser나는 참여하는 것이 절대적으로 괜찮다고 명시적으로 말하고 싶습니다 . 하지만 내 웹사이트 폴더 외부 어딘가에 링크를 만드는 방법을 모르겠습니다.

추신: 추가 정보가 필요하면 문의하세요.

답변1

내 생각에 해야 할 일은 . 대신 php/ 데이터를 직접 반환하는 것입니다 . 귀하의 코드는 동일한 작업을 수행할 수 있습니다 . 내 경험상 이것은 다른 디렉토리를 열거나 를 사용하거나 에 대한 파일 권한을 변경하는 것 보다 훨씬 낫습니다 .pythonapacheapachesudoapache

프로그램이 인터넷 연결보다 더 빠르게 대용량 파일을 생성하는 경우 프로그램에서 직접 데이터를 스트리밍할 수 있으므로 추가 데이터 파일과 이를 관리하는 코드 및 이를 기억하는 메커니즘이 제거됩니다.

Stack Overflow에 대한 이 답변은 .NET에서 코드가 작동하는 방식을 보여줍니다 php.https://stackoverflow.com/a/4357904/5484716.

이런 방식으로 호출되는 프로그램의 경우 모든 stderr스트림 출력을 제거하고 Python 프로세스의 반환 코드가 프로세스의 성공 또는 실패를 정확하게 반영하는지 확인하세요.

아래 예제는 popen()stackoverflow의 위 예제 시나리오에서 사용할 호출을 보여줍니다. exec 2>/dev/null;쉘 명령 앞에 추가했습니다 . 이렇게 하면 셸 자체에서도 출력이 표준 오류로 진행되지 않습니다. 데이터가 와 에서 stderr교착 stdout상태의 원인이 될 수 있기 때문입니다 popen().

사용자에게 디스크 파일을 다운로드하려면:

$fp = popen('exec 2>/dev/null; sudo -u theuser cat yourfile.zip', 'r');

활성 프로세스에서 데이터를 다운로드하려면 다음을 수행하십시오.

$fp = popen('exec 2>/dev/null; sudo yourpythonscript arg argN', 'r');

이 명령줄~이다쉘 명령이며 쉘 메타 문자에 대해 적절하게 인용되어야 합니다.

두 번째 방법에서는 서버가 즉시 데이터 전송을 시작합니다. 사용자가 양식을 성공적으로 제출하면 즉시 브라우저에 "다른 이름으로 저장" 대화 상자가 표시됩니다. 사용자가 출력 파일을 선택하자마자 php스크립트는 데이터를 유선을 통해 원격 파일로 직접 전송합니다.

스크립트 python가 인쇄되어야 합니다.오직표준 출력의 zip 데이터를 반환하고 zip 프로세스의 성공 또는 실패를 정확하게 나타내는 종료 코드를 반환합니다. python스크립트 에서는 sys.stdout예를 들어 에 출력을 작성해야 합니다 zf = ZipFile(sys.stdout, ....

pclose()호출하여 반환 값을 확인하는 것이 중요합니다., 그것이 zip이 성공했는지 여부를 알 수 있는 유일한 방법이기 때문입니다. pclose()0이 아닌 값을 반환 하면 뭔가 잘못된 것입니다.

클라이언트에서 파일을 처리하는 방법은 , 및 기타 설정에 따라 다릅니다 response headers.content-type:content-encoding:content-disposition:http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.htmlresponse-header, 및 정보를 살펴보세요 entity-header.

관련 정보