it-swarm-ko.tech

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

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

이 메커니즘은 또한 /etc/hosts 파일.

205
redspike

찾고있는 기능은 glibc에서 구현됩니다. HOSTALIASES 환경 변수를 설정하여 사용자 정의 호스트 파일을 정의 할 수 있습니다. 이 파일의 이름은 gethostbyname에 의해 선택됩니다 ( documentation 참조).

예 (우분투 13.10에서 테스트) :

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

몇 가지 제한 사항 :

  • HOSTALIASESgetaddrinfo(3) 또는 gethostbyname(3)을 사용하는 응용 프로그램에서만 작동합니다.
  • setuid / setgid / setcap 응용 프로그램 인 libc는 환경을 삭제합니다. 즉 HOSTALIASES 설정이 손실됩니다. ping 은 setuid root이거나 (ICMP 패킷을 수신해야하기 때문에) 실행시 net_raw 기능이 제공되므로 HOSTALIASESping을 호출하기 전에 이미 루트가 아닌 한 ping을 사용하십시오.
141
pwuertz

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.6에 nscd 소켓 (/var/run/nscd/socket와 같은 경로)을 대체하십시오. 존재하지 않는 경로가 있습니다.

44
Stéphane Chazelas

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
28
frielp

나는 같은 요구에 직면하여 libnss-userhosts를 시도했지만 멀티 스레드 응용 프로그램에서는 실패합니다. 따라서 libnss-homehosts 를 작성했습니다. 매우 새롭고 나만 테스트했습니다. 당신은 기회를 줄 수 있습니다! /etc/Host.conf의 일부 옵션, 여러 개의 별칭 이름 및 역방향 확인 (주소 이름)을 지원합니다.

6
bandie

한 가지 해결책은 각 사용자를 별도의 chroot에 두는 것이므로 각각은 별도의 /etc/hosts 자신에게.

6
Pletiplot

~/.bashrc에 다음을 배치하면 bash에서 나를 위해 일하고 있습니다. 명령의 호스트 이름을 ~/.hosts의 항목을 기반으로 주소로 변환합니다. ~/.hosts가 없거나 ~/.hosts에서 호스트 이름을 찾을 수 없으면 명령이 정상적으로 실행됩니다. 이것은 관련 기능의 원래 플래그와 함께 작동해야하며 호스트 이름이 플래그와 관련하여 배치되는 위치에 대한 정보를 제공합니다 (예 : ping -i 0.5 Host1 -c 3, 작동합니다. ~/.hosts 파일은 호스트 이름을 찾기 위해 다른 위치보다 우선합니다. 따라서 두 개의 호스트 이름이 있으면 ~/.hosts의 주소가 사용됩니다.

$ cat ~/.bashrc 
function resolve {
        hostfile=~/.hosts
        if [[ -f "$hostfile" ]]; then
                for arg in $(seq 1 $#); do
                        if [[ "${!arg:0:1}" != "-" ]]; then
                                ip=$(sed -n -e "/^\s*\(\#.*\|\)$/d" -e "/\<${!arg}\>/{s;^\s*\(\S*\)\s*.*$;\1;p;q}" "$hostfile")
                                if [[ -n "$ip" ]]; then
                                        command "${FUNCNAME[1]}" "${@:1:$(($arg-1))}" "$ip" "${@:$(($arg+1)):$#}"
                                        return
                                fi
                        fi
                done
        fi
        command "${FUNCNAME[1]}" "[email protected]"
}

function ping {
        resolve "[email protected]"
}

function traceroute {
        resolve "[email protected]"
}

~/.hosts의 예는 다음과 같습니다. /etc/hosts와 같은 형식을 따릅니다. 주석과 공백이 올바르게 처리됩니다.

$ cat ~/.hosts 
# addresses and hostnames
stackexchange.com se

192.168.0.1 Host1 # this is Host1's address
login-node.inst.ac.uk login
4
Kyle Fernandes

이것이 당신에게 도움이 될지 확실하지 않지만, 여기에는 내 사용자 만 쉽게 액세스 할 수있는 저장된 "호스트"를 추가 할 수있는 방법을 찾고있었습니다.

기본적으로 업무용 네트워크의 특정 상자에 ssh를 넣을 수 있어야했는데 여기에는 하나의 진입 점이 있습니다.

내가 한 것은 내 .bashrc 파일에 별칭을 추가하는 것이 었습니다.

예를 들어 다음을 추가 한 경우 :

alias jrfbox='ssh [email protected]' 

~/.bashrc 맨 아래에 있습니다 (~는 홈 디렉토리입니다). 그런 다음 로그 아웃했다가 다시 로그인하면 jrfbox를 입력하고 Enter연결됩니다.

2
Jason