it-swarm.it

Posso creare un file hosts specifico dell'utente per integrare / etc / hosts?

È possibile aggiungere un elenco di host specifici solo per un determinato utente? Forse un file host specifico dell'utente?

Questo meccanismo dovrebbe anche integrare le voci nel /etc/hosts file.

205
redspike

La funzionalità che stai cercando è implementata in glibc. È possibile definire un file hosts personalizzato impostando la variabile di ambiente HOSTALIASES. I nomi in questo file saranno raccolti da gethostbyname (vedi documentazione ).

Esempio (testato su Ubuntu 13.10):

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

Alcune limitazioni:

  • HOSTALIASES funziona solo per applicazioni che utilizzano getaddrinfo(3) o gethostbyname(3)
  • Per setuid / setgid / setcap applicazioni, libc disinfetta l'ambiente, il che significa che l'impostazione HOSTALIASES viene persa. ping è setuid root o riceve la capacità net_raw al momento dell'esecuzione (perché deve ascoltare i pacchetti ICMP), quindi HOSTALIASES non funzionerà con ping a meno che tu non sia già root prima di chiamare ping.
141
pwuertz

Oltre al LD_PRELOAD trucchi. Una semplice alternativa che potrebbe funzionare su alcuni sistemi sarebbe quella di modificare binariamente una copia della libreria di sistema che gestisce la risoluzione del nome host per sostituire /etc/hosts con un percorso tutto tuo.

Ad esempio, su Linux:

Se non stai usando nscd, copia libnss_files.so in una posizione qualsiasi come:

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

(la libreria condivisa potrebbe trovarsi altrove, ad esempio /lib/libnss_files.so.2)

Ora, modifica binaria la copia per sostituire /etc/hosts lì dentro a qualcosa della stessa lunghezza di /tmp/hosts.

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

Modificare /tmp/hosts per aggiungere la voce desiderata. E usare

export LD_LIBRARY_PATH=~/lib

per nss_files per cercare /tmp/hosts invece di /etc/hosts.

Invece di /tmp/hosts, potresti anche farlo /dev/fd//3 (qui usando due barre in modo che la lunghezza di /dev/fd//3 è uguale a quello di /etc/hosts), e fai

exec 3< ~/hosts

Ad esempio, che consentirebbe a comandi diversi di utilizzare file hosts diversi.

Se nscd è installato e in esecuzione, puoi bypassarlo facendo lo stesso trucco, ma questa volta per libc.so.6 e sostituisci il percorso al socket nscd (qualcosa come /var/run/nscd/socket) con un percorso inesistente.

44

Gli spazi di montaggio privati ​​creati con il comando unshare possono essere utilizzati per fornire un file privato/etc/hosts a un processo Shell e qualsiasi processo figlio successivo avviato da quella Shell.

# 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

Ho affrontato la stessa necessità, quindi ho provato libnss-userhosts, ma fallisce nelle applicazioni multithread. Pertanto ho scritto libnss-homehosts . È molto nuovo e testato solo da me. Puoi dargli una possibilità! Supporta alcune opzioni in /etc/Host.conf, più nomi di alias e risoluzione inversa (indirizzo per nome).

6
bandie

Una soluzione è quella di avere ciascun utente in un chroot separato, in modo che ciascuno di essi possa avere un /etc/hosts a se stessi.

6
Pletiplot

Inserire quanto segue in ~/.bashrc Funziona per me in bash. Converte il nome host nel comando in un indirizzo basato sulle voci in ~/.hosts. Se ~/.hosts Non esiste o se il nome host non può essere trovato in ~/.hosts, Il comando viene eseguito normalmente. Questo dovrebbe funzionare con i flag originali delle funzioni pertinenti e senza regar di dove si trova il nome host rispetto ai flag, ad es. ping -i 0.5 Host1 -c 3, Funziona. Il file ~/.hosts Preferisce qualsiasi altra posizione per trovare i nomi host, quindi se ci sono nomi host duplicati, verrà usato l'indirizzo in ~/.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]"
}

Di seguito è riportato un esempio di ~/.hosts. Segue lo stesso formato di /etc/hosts. Commenti e spazi bianchi sono gestiti correttamente.

$ 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

Non sono sicuro che questo possa aiutarti, ma sono venuto qui alla ricerca di un modo per aggiungere "host" salvati da qualche parte che fosse facilmente accessibile solo al mio utente.

Fondamentalmente avevo bisogno di essere in grado di accedere a determinate caselle sulla nostra rete di lavoro, che ha solo un punto di accesso.

Quello che ho fatto è stato aggiungere alias al mio .bashrc file.

Ad esempio, se hai aggiunto:

alias jrfbox='ssh [email protected]' 

nella parte inferiore del tuo ~/.bashrc (~ è la tua home directory). Quindi dopo aver effettuato il logout e di nuovo l'accesso, è possibile digitare jrfbox, premere Entere si connetterà.

2
Jason