Czy można dodać listę hostów specyficznych tylko dla określonego użytkownika? Być może specyficzny dla użytkownika plik hosts?
Mechanizm ten powinien również uzupełniać wpisy w /etc/hosts
pliku.
Czy można dodać listę hostów specyficznych tylko dla określonego użytkownika? Być może specyficzny dla użytkownika plik hosts?
Mechanizm ten powinien również uzupełniać wpisy w /etc/hosts
pliku.
Odpowiedzi:
Funkcjonalność, której szukasz, została zaimplementowana w glibc. Możesz zdefiniować niestandardowy plik hosts, ustawiając HOSTALIASES
zmienną środowiskową. Nazwy w tym pliku zostaną zebrane przez gethostbyname
(patrz dokumentacja ).
Przykład (testowany na Ubuntu 13.10):
$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null
Niektóre ograniczenia:
HOSTALIASES
działa tylko dla aplikacji używających getaddrinfo(3)
lubgethostbyname(3)
HOSTALIASES
ustawienie zostało utracone. ping jest setuid root (ponieważ musi nasłuchiwać pakietów ICMP), więc HOSTALIASES
nie będzie działał z pingiem, chyba że jesteś już rootem przed wywołaniem ping.nscd
i jest ograniczone do nazw hostów bez kropki.
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
można zobaczyć coś takiego: /usr/bin/ping = cap_net_admin,cap_net_raw+p
. I technicznie jest tak, że musi otworzyć surowe gniazdo zamiast ICMP (ale przypuszczam, że można argumentować, że to tylko semantyka).
Oprócz LD_PRELOAD
sztuczek. Prostą alternatywą, która może działać na kilku systemach, byłaby edycja binarna kopii biblioteki systemowej, która obsługuje rozpoznawanie nazw hostów w celu zastąpienia ich /etc/hosts
własną ścieżką.
Na przykład w systemie Linux:
Jeśli nie używasz nscd
, skopiuj libnss_files.so
do własnej lokalizacji, na przykład:
mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib
(udostępniona biblioteka może znajdować się w innym miejscu, np. /lib/libnss_files.so.2
)
Teraz edytuj kopię binarnie, aby zamienić /etc/hosts
tam coś na taką samą długość /tmp/hosts
.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Edytuj, /tmp/hosts
aby dodać żądany wpis. I użyć
export LD_LIBRARY_PATH=~/lib
dla nss_files
spojrzeć w /tmp/hosts
zamiast /etc/hosts
.
Zamiast tego /tmp/hosts
możesz to zrobić /dev/fd//3
(tutaj, używając dwóch ukośników, aby długość /dev/fd//3
była taka sama jak /etc/hosts
), i wykonaj
exec 3< ~/hosts
Na przykład, które pozwoliłyby różnym poleceniom korzystać z różnych hosts
plików.
Jeśli nscd
jest zainstalowany i uruchomiony, możesz go obejść, wykonując tę samą sztuczkę, ale tym razem libc.so.6
i zastąp ścieżkę do gniazda nscd (coś podobnego /var/run/nscd/socket
) jakąś nieistniejącą ścieżką.
LD_LIBRARY_PATH
wskazania na katalog należący do użytkownika oznacza, że każdy inny proces uruchamiany przez użytkownika może korzystać z tego katalogu, aby dokooptować wszelkie nowe procesy powstałe przez zastąpienie bibliotek. Aktualizacje za libnss_files.so
pośrednictwem menedżera pakietów (w tym aktualizacje zabezpieczeń) nie będą odzwierciedlone w poprawionej wersji. Modyfikowanie LD_LIBRARY_PATH
jest ogólnie rzecz biorąc złe z innych powodów, ale jest też nierozsądne z powodu tych problemów.
Prywatnych obszarów montowania utworzonych za pomocą unshare
komendy można użyć do udostępnienia prywatnego pliku / etc / hosts procesowi powłoki i wszelkim kolejnym procesom potomnym rozpoczynającym się od tej powłoki.
# 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)
i clone(2)
to jest część magii tutaj. Zobacz także namespaces(7)
i user_namespaces(7)
.
Jednym z rozwiązań jest umieszczenie każdego użytkownika w osobnym miejscu chroot
, aby każdy mógł mieć oddzielne /etc/hosts
dla siebie.
Stawiłem czoła tej samej potrzebie, więc wypróbowałem libnss-userhosts, ale nie działa w aplikacjach wielowątkowych. Dlatego napisałem libnss-homehosts . Jest bardzo nowy i przetestowany tylko przeze mnie. Możesz dać temu szansę! Obsługuje niektóre opcje w /etc/host.conf, wiele nazw aliasów i odwrotne rozpoznawanie (adres do nazwy).
Umieszczenie poniższego ~/.bashrc
działa dla mnie w bash. Konwertuje nazwę hosta w poleceniu na adres oparty na wpisach w ~/.hosts
. Jeśli ~/.hosts
nie istnieje lub nie można znaleźć nazwy hosta ~/.hosts
, polecenie jest wykonywane normalnie. Powinno to działać z oryginalnymi flagami odpowiednich funkcji i niezależnie od tego, gdzie nazwa hosta jest umieszczona względem flag, np ping -i 0.5 host1 -c 3
. Działa. ~/.hosts
Plik ma pierwszeństwo przed każdym innym miejscu na znalezienie nazwy hostów, więc jeśli są jakieś dupicate hostów, adres w ~/.hosts
zostaną wykorzystane.
$ 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 "$@"
}
Przykład ~/.hosts
podano poniżej. Ma taki sam format jak /etc/hosts
. Komentarze i białe znaki są obsługiwane poprawnie.
$ cat ~/.hosts
# addresses and hostnames
stackexchange.com se
192.168.0.1 host1 # this is host1's address
login-node.inst.ac.uk login
Nie jestem pewien, czy to by ci pomogło, ale przyszedłem tutaj, aby znaleźć sposób dodania zapisanych „hostów” w miejscu łatwo dostępnym tylko dla mojego użytkownika.
Zasadniczo musiałem móc ssh w niektórych polach w naszej sieci roboczej, która ma tylko jeden punkt wejścia.
Dodałem aliasy do mojego .bashrc
pliku.
Na przykład, jeśli dodałeś:
alias jrfbox='ssh jason@192.168.6.6'
na dole twojego ~/.bashrc
( ~
jest twoim katalogiem domowym). Następnie po ponownym wylogowaniu i zalogowaniu się możesz pisać jrfbox
, naciskać Enter, a nastąpi połączenie.
man ssh_config
.
~/.bashrc
, po prostu zrób to source ~/.bashrc
.
. ~/.bashrc