/etc/hosts를 보완하기 위해 사용자별 호스트 파일을 만들 수 있습니까?

/etc/hosts를 보완하기 위해 사용자별 호스트 파일을 만들 수 있습니까?

특정 사용자에게만 해당되는 호스트 목록을 추가할 수 있습니까? 어쩌면 사용자별 호스트 파일일까요?

메커니즘은 문서의 항목도 보완해야 합니다 /etc/hosts.

답변1

당신이 찾고 있는 기능은 glibc에 구현되어 있습니다. 환경 변수를 설정하여 사용자 정의 호스트 파일을 정의할 수 있습니다 HOSTALIASES. 이 파일의 이름은 다음으로 대체됩니다 gethostbyname(참조:문서).

예(Ubuntu 13.10에서 테스트됨):

$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null

몇 가지 제한사항:

  • HOSTALIASESgetaddrinfo(3)또는를 사용하는 애플리케이션 에만 사용할 수 있습니다 .gethostbyname(3)
  • ~을 위한설정값/설정/세트 캡애플리케이션 내에서 libc는 환경을 정리하므로 설정이 HOSTALIASES손실됩니다.평평한setuid 루트이거나 net_raw실행 시 활성화되므로(ICMP 패킷을 수신해야 하기 때문에) HOSTALIASES호출하기 전에 이미 루트가 아니면 작동하지 않습니다.pingping

답변2

LD_PRELOAD스킬 빼고요 . 일부 시스템에서 작동할 수 있는 간단한 대안은 호스트 이름 확인을 처리하는 시스템 라이브러리의 복사본을 바이너리 편집하여 /etc/hosts자신의 경로로 바꾸는 것입니다.

예를 들어 Linux에서는 다음과 같습니다.

사용하지 않는 경우 다음과 같은 위치에 nscd복사하세요 .libnss_files.so

mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib

(공유 라이브러리는 다른 곳에 있을 수 있습니다. 예를 들어 /lib/libnss_files.so.2)

이제 복사본을 이진 편집하여 /etc/hosts동일한 길이의 것으로 교체합니다 /tmp/hosts.

perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2

/tmp/hosts필수 항목을 추가하려면 편집하세요 . 그리고 사용

export LD_LIBRARY_PATH=~/lib

대신 nss_files보러 오세요 ./tmp/hosts/etc/hosts

를 제외하고는 (여기서 두 개의 슬래시를 사용하여 의 길이가 의 길이와 같도록 ) /tmp/hosts만들 수도 있습니다./dev/fd//3/dev/fd//3/etc/hosts

exec 3< ~/hosts

예를 들어 , 이렇게 하면 서로 다른 명령이 서로 다른 파일을 사용할 수 있습니다 hosts.

설치되어 실행 중인 경우 nscd동일한 방법을 사용하여 문제를 해결할 수 있지만 이번에는 libc.so.6nscd 소켓에 대한 경로(예: /var/run/nscd/socket)를 존재하지 않는 경로로 바꿉니다.

답변3

이 명령으로 생성된 개인 마운트 공간은 unshare셸 프로세스와 셸에서 시작된 모든 후속 하위 프로세스에 개인 /etc/hosts 파일을 제공하는 데 사용될 수 있습니다.

# Start by creating your custom /etc/hosts file
[user] cd ~
[user] cat >my_hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 news.bbc.co.uk
EOF

[user] sudo unshare --mount
# We're now running as root in a private mountspace. 
# Any filesystem mounts performed in this private mountspace
# are private to this shell process and its children

# Use a bind mount to install our custom hosts file over /etc/hosts
[root] mount my_hosts /etc/hosts --bind

[root] cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 news.bbc.co.uk

[root] exec su - appuser

[appuser] # Run your app here that needs a custom /etc/hosts file

[appuser] ping news.bbc.co.uk
PING news.bbc.co.uk (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.026 ms
^C
--- news.bbc.co.uk ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.026/0.044/0.062/0.018 ms

답변4

한 가지 해결책은 각 사용자를 별도의 사용자로 지정하여 chroot각 사용자가 자신만의 별도 사용자를 가질 수 있도록 하는 것입니다 /etc/hosts.

관련 정보