특정 사용자에게만 해당되는 호스트 목록을 추가 할 수 있습니까? 아마도 사용자 별 호스트 파일일까요?
이 메커니즘은 /etc/hosts
파일 의 항목도 보완해야 합니다.
특정 사용자에게만 해당되는 호스트 목록을 추가 할 수 있습니까? 아마도 사용자 별 호스트 파일일까요?
이 메커니즘은 /etc/hosts
파일 의 항목도 보완해야 합니다.
답변:
찾고있는 기능은 glibc에서 구현됩니다. HOSTALIASES
환경 변수 를 설정하여 사용자 정의 호스트 파일을 정의 할 수 있습니다 . 이 파일의 이름은 gethostbyname
( 문서 참조 )에 의해 선택됩니다 .
예 (우분투 13.10에서 테스트) :
$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null
몇 가지 제한 사항 :
HOSTALIASES
만 사용하는 응용 프로그램 작동 getaddrinfo(3)
이나gethostbyname(3)
HOSTALIASES
설정이 손실됩니다. ping 은 setuid root (ICMP 패킷을 수신해야하기 때문에)이므로 HOSTALIASES
ping을 호출하기 전에 이미 루트 상태가 아니면 ping을 사용할 수 없습니다.nscd
호스트 이름을 사용하는 경우에는 작동하지 않습니다 .
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
하면 다음과 같은 것을 볼 수 있습니다 : /usr/bin/ping = cap_net_admin,cap_net_raw+p
. 그리고 기술적으로 그것은 ICMP 대신 원시 소켓을 열어야한다는 것입니다 (그러나 나는 그것이 의미론이라고 주장 할 수 있다고 생각합니다).
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
몇 가지 존재하지 않는 경로를).
LD_LIBRARY_PATH
사용자가 소유 한 디렉토리를 가리 키도록 변경 하면 사용자가 실행하는 다른 프로세스가 해당 디렉토리를 사용하여 라이브러리를 교체하여 생성 된 새 프로세스를 선택할 수 있습니다. 그리고 libnss_files.so
패키지 관리자 를 통한 업데이트 (보안 업데이트 포함)는 패치 된 버전에 반영되지 않습니다. 수정 LD_LIBRARY_PATH
은 일반적으로 다른 이유로 권장하지 않는 것이 좋지만 이러한 문제로 인해 현명하지 않습니다.
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
unshare(2)
있으며 clone(2)
그것은 마술의 일부입니다. 참조 namespaces(7)
및 user_namespaces(7)
.
한 가지 해결 방법은 각 사용자를 chroot
별도의 상태 /etc/hosts
로 두는 것 입니다.
나는 같은 요구에 직면하여 libnss-userhosts를 시도했지만 멀티 스레드 응용 프로그램에서는 실패합니다. 따라서 libnss-homehosts 작성 했습니다 . 매우 새롭고 나만 테스트했습니다. 기회가 생길 수도 있습니다! /etc/host.conf의 일부 옵션, 여러 개의 별칭 이름 및 역방향 확인 (주소 이름)을 지원합니다.
다음을 배치하면 ~/.bashrc
bash에서 나를 위해 일하고 있습니다. 명령의 호스트 이름을의 항목을 기반으로하는 주소로 변환합니다 ~/.hosts
. 경우는 ~/.hosts
존재하지 않거나 호스트 이름에서 찾을 수없는 경우 ~/.hosts
, 명령이 정상적으로 실행됩니다. 이것은 관련 함수의 원래 플래그와 함께 작동해야하며 호스트 이름이 플래그와 관련하여 배치되는 위치에 관계가 없습니다 (예 : ping -i 0.5 host1 -c 3
작동). ~/.hosts
파일은 호스트 이름을 찾기 위해 다른 위치보다 우선한다, 그래서 어떤 dupicate 호스트 이름이있는 경우에 주소가 ~/.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]}" "$@"
}
function ping {
resolve "$@"
}
function traceroute {
resolve "$@"
}
~/.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
이것이 당신에게 도움이 될지 확실하지 않지만, 여기에는 내 사용자 만 쉽게 액세스 할 수있는 저장된 "호스트"를 추가하는 방법을 찾고있었습니다.
기본적으로 업무용 네트워크의 특정 상자에 ssh를 넣을 수 있어야했는데 여기에는 하나의 진입 점이 있습니다.
내가 한 것은 내 .bashrc
파일 에 별칭을 추가하는 것이 었습니다 .
예를 들어 다음을 추가 한 경우 :
alias jrfbox='ssh jason@192.168.6.6'
맨 아래에 ~/.bashrc
( ~
홈 디렉토리입니다). 그런 다음 로그 아웃하고 다시 로그인 한 후을 입력 jrfbox
하고을 누르면 Enter연결됩니다.
man ssh_config
.
~/.bashrc
, 간단하게 할 source ~/.bashrc
.
. ~/.bashrc