È 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.
È 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.
Risposte:
La funzionalità che stai cercando è implementata in glibc. È possibile definire un file host personalizzato impostando la HOSTALIASES
variabile di ambiente. 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 le applicazioni che utilizzano getaddrinfo(3)
ogethostbyname(3)
HOSTALIASES
impostazione è persa. ping è setuid root (perché deve ascoltare i pacchetti ICMP), quindi HOSTALIASES
non funzionerà con ping a meno che tu non sia già root prima di chiamarlo.nscd
ed è limitato ai nomi host senza punto.
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
si potrebbe vedere qualcosa di simile: /usr/bin/ping = cap_net_admin,cap_net_raw+p
. E tecnicamente è che ha bisogno di aprire un socket raw anziché ICMP (ma suppongo che potresti sostenere che è solo una semantica).
Accanto ai 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 sostituirla /etc/hosts
con un percorso personale.
Ad esempio, su Linux:
Se non lo stai usando nscd
, copia libnss_files.so
in una tua posizione come:
mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib
(la libreria condivisa può trovarsi altrove, ad es. /lib/libnss_files.so.2
)
Ora, modifica binaria la copia per sostituirla /etc/hosts
con qualcosa della stessa lunghezza /tmp/hosts
.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Modifica /tmp/hosts
per aggiungere la voce desiderata. E usare
export LD_LIBRARY_PATH=~/lib
per nss_files
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
sia la stessa di quella di /etc/hosts
), e fai
exec 3< ~/hosts
Ad esempio, ciò consentirebbe a comandi diversi di utilizzare hosts
file diversi .
Se nscd
è installato e in esecuzione, puoi bypassarlo facendo lo stesso trucco, ma questa volta per libc.so.6
e sostituire il percorso al socket nscd (qualcosa di simile /var/run/nscd/socket
) con un percorso inesistente.
LD_LIBRARY_PATH
a una directory di proprietà dell'utente significa che qualsiasi altro processo eseguito dall'utente può utilizzare quella directory per cooptare qualsiasi nuovo processo generato sostituendo le librerie. E gli aggiornamenti libnss_files.so
tramite il gestore pacchetti (inclusi gli aggiornamenti di sicurezza) non si rifletteranno nella versione patchata. La modifica LD_LIBRARY_PATH
è generalmente una cosa negativa da raccomandare per altri motivi, ma è anche poco saggia a causa di questi problemi.
Gli spazi di montaggio privati creati con il unshare
comando possono essere utilizzati per fornire un file privato / etc / hosts a un processo di shell e tutti i successivi processi figlio avviati 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
unshare(2)
e clone(2)
questo fa parte della magia qui. Vedi anche namespaces(7)
e user_namespaces(7)
.
Una soluzione è quella di avere ciascun utente in un separato chroot
, in modo che ciascuno di essi possa avere un separato /etc/hosts
per sé.
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).
Posizionare quanto segue ~/.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 non è possibile trovare il nome host ~/.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 esempio ping -i 0.5 host1 -c 3
, funziona. Il ~/.hosts
file preferisce qualsiasi altra posizione per trovare i nomi host, quindi se ci sono nomi host duplicati, ~/.hosts
verrà utilizzato l'indirizzo in .
$ 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 "$@"
}
Di ~/.hosts
seguito è riportato un esempio di . 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
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 jason@192.168.6.6'
in fondo alla tua ~/.bashrc
( ~
è la tua home directory). Quindi dopo aver effettuato il logout e di nuovo l'accesso, è possibile digitare jrfbox
, premere Entere si connetterà.
man ssh_config
.
~/.bashrc
, semplicemente source ~/.bashrc
.
. ~/.bashrc