PHP chroot의 DNS 확인

PHP chroot의 DNS 확인

나는 chroot를 생성하고 php-fpm과 apache2를 설정하여 웹 사이트가 작동하도록 하는 스크립트를 만들었습니다. 내 스크립트에서는 다음을 사용하여 필요한 모든 라이브러리를 chroot lib(s) 디렉터리에 복사합니다.

fileArray=$(ldd /usr/bin/php* 2>/dev/null | awk 'NF == 4 {print $3}; NF == 2 {print $1}' | sort -u)

for file in $fileArray
do
  dirName="$(dirname $file)"
  [ ! -d "$serverDir$dirName" ] && mkdir -p "$serverDir$dirName" || :
  cp $file "$serverDir$dirName"
done

하지만 다음과 같은 작은 스크립트를 사용하면 다음과 같은 사실을 발견했습니다.

<?php 
  print_r(gethostbynamel("google.com")); 
?>

libnss_dns.so.1이 라이브러리에 없으면 해결되지 않습니다. 이제 내 질문은: libnss_dns를 내 chroot에 "ldd" 복사하려면 어떤 파일이 필요합니까?

추신: 내 스크립트가 아키텍처 간이 되기를 원하기 때문에 수동으로 복사하고 싶지 않습니다.

답변1

옵션을 제공 ldd하거나 ldd함수를 호출하여 libnss_dns.so.1복사할 라이브러리 목록에 포함시킬 수 없습니다. 구성 파일의 내용은 동적 링커(예: /etc/nsswitch.conf) 와 아무 관련이 없고 ldd프로그램이 이러한 방식으로 어떤 라이브러리를 동적으로 로드할지 여부를 알 수 있는 방법이 없기 때문에 라이브러리는 런타임에 동적으로 로드됩니다.

/dev/null작동하는 chroot를 생성하려면 사용 중인 항목에 따라 로케일 구성부터 지역 설정까지 모든 파일을 수동으로 복사해야 할 수도 있습니다 .

추신: 내 스크립트가 아키텍처 간이 되기를 원하기 때문에 수동으로 복사하고 싶지 않습니다.

불행 chroot하게도 그것을 올바르게 하는 것은 본질적으로 이식성이 없는 일입니다. 즉, 설정에 사용할 수 있는 표준 API가 없습니다.

(여기서 "교차 아키텍처"를 의미하는 것은 아닙니다. SPARC에 루트가 지정된 작업자 프로그램이 있다고 가정하면 동일한 프로그램이 동일한 OS의 x86_64에서 제대로 실행되어야 합니다.)

debootstrap새로운 chroot를 설정하는 것과 같은 것을 시도해 볼 수 있습니다 . 최소한 패키지 관리자와 연결되어 있으므로 모든 종속성이 존재하는지 확인합니다. 그럼에도 불구하고 debootstrap여러 시스템 파일(예:)은 /etc/fstabTODO 상태로 남아 있습니다.

관련 정보