![PHP에서 루트로 bash 스크립트를 실행하는 중에 문제가 발생했습니다.](https://linux55.com/image/84393/PHP%EC%97%90%EC%84%9C%20%EB%A3%A8%ED%8A%B8%EB%A1%9C%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%20%EC%A4%91%EC%97%90%20%EB%AC%B8%EC%A0%9C%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
나는 서버에 owncloud 및 plex와 같은 애플리케이션을 설치할 수 있는 PHP 패널을 만들고 있습니다. 소프트웨어 설치 및 제거를 위한 여러 bash 스크립트를 만들었습니다. 나는 이 모든 것을 쉘에서 테스트했고 모든 것이 잘 작동했습니다. 그러나 우분투 15.10에서 루트로 sudo를 사용하여 PHP에서 스크립트를 실행하면 apt-get 및 dpkg가 작동하지 않습니다.
Visudo에는 다음이 있습니다.
seedbox ALL = (root) NOPASSWD: /bin/appinstaller
appinstaller는 응용 프로그램 설치/제거 bash 스크립트(예: appinstaller plex)를 실행하는 데 사용되는 bash 스크립트입니다.
Plex 스크립트 예:
dpkg --configure -a
cd /tmp
wget https://downloads.plex.tv/plex-media-server/0.9.15.6.1714-7be11e1/plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb
dpkg -i plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb
Bash에서 직접 appinstaller를 실행하면 모든 것이 잘 작동합니다.
PHP를 사용하여 appinstaller를 실행할 때(스크립트가 루트로 실행되고 있는지 확인):
exec("sudo /bin/appinstaller plex > /home/installer.log 2>&1 &");
작동하지만 다른 응용 프로그램을 설치하려고 하면 다음과 같은 apt & dpkg 오류가 발생합니다.
E: plexmediaserver 패키지를 다시 설치해야 하는데 해당 아카이브를 찾을 수 없습니다. (설치되어 실행 중이더라도)
또한 dpkg --configure -a
오류를 반환합니다.
Plex는 잘 작동하지만 apt가 설치 프로세스를 완료하지 못하고 어딘가에 멈춰 있는 것 같습니다. apt-get install
/ 이후에 실행되는 명령 dpkg
도 php에서 실행되지 않고 bash에서 실행됩니다. 또한 cron 및 systemctl에서 스크립트를 실행해 보았지만 동일한 문제가 발생했습니다.
일부 앱은 문제 없이 설치/제거된다는 점은 주목할 가치가 있습니다.
php/cron/systemctl에서 스크립트를 실행하는 것과 쉘에서 직접 실행하는 것의 차이점은 무엇입니까? 일반 bash 세션을 시뮬레이션할 수 있나요?
답변1
PHP 스크립트를 루트로 실행하는 것은 위험한 습관입니다. 웹 서버는 권한 상승을 방지하고 다음과 같은 다양한 조치를 구현하기 위해 최선을 다합니다.chroot 감옥. 나는 이것이 당신의 문제의 원인일 수 있다고 믿습니다.
특히, 제대로 작동 dpkg
하려면 파일에 대한 액세스가 필요합니다 /var/lib/dpkg/
. 예를 들어 PHP 스크립트에서 파일 목록을 시도하여 이 디렉토리에 액세스할 수 있는 권한이 있는지 확인할 수 있습니다 /var/lib/dpkg/status
. 그렇지 않은 경우(루트로 실행하더라도) 실제로 감옥에 있는 것입니다. 물론 감옥을 비활성화할 수 있지만(이 작업을 수행하는 방법은 웹 서버에 따라 다름) 권장하지 않습니다. 보안 메커니즘을 우회하면 다양한 공격에 노출되는 데에는 이유가 있습니다.