Ist es möglich, eine Liste von Hosts hinzuzufügen, die nur für einen bestimmten Benutzer spezifisch sind? Vielleicht eine benutzerspezifische Hosts-Datei?
Dieser Mechanismus sollte auch die Einträge in der /etc/hosts
Datei ergänzen .
Ist es möglich, eine Liste von Hosts hinzuzufügen, die nur für einen bestimmten Benutzer spezifisch sind? Vielleicht eine benutzerspezifische Hosts-Datei?
Dieser Mechanismus sollte auch die Einträge in der /etc/hosts
Datei ergänzen .
Antworten:
Die von Ihnen gesuchte Funktionalität ist in glibc implementiert. Sie können eine benutzerdefinierte Hostdatei definieren, indem Sie die HOSTALIASES
Umgebungsvariable festlegen . Die Namen in dieser Datei werden von übernommen gethostbyname
(siehe Dokumentation ).
Beispiel (getestet auf Ubuntu 13.10):
$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ wget g -O /dev/null
Einige Einschränkungen:
HOSTALIASES
Funktioniert nur für Anwendungen, die getaddrinfo(3)
oder verwendengethostbyname(3)
HOSTALIASES
Einstellung verloren geht. ping ist setuid root (da es auf ICMP-Pakete warten muss), HOSTALIASES
funktioniert also nicht mit ping, es sei denn, Sie sind bereits root, bevor Sie ping aufrufen.nscd
Hostnamen ohne Punkt verwenden.
127.0.0.1 somedomain.com
)
getcap /usr/sbin/ping
könnten Sie sehen so etwas wie: /usr/bin/ping = cap_net_admin,cap_net_raw+p
. Und technisch gesehen muss es eher einen Raw-Socket als einen ICMP-Socket öffnen (aber ich nehme an, Sie könnten argumentieren, dass dies nur eine Semantik ist).
Neben den LD_PRELOAD
Tricks. Eine einfache Alternative, die auf einigen Systemen funktionieren kann, besteht darin, eine Kopie der Systembibliothek, die die Auflösung von Hostnamen handhabt, binär zu bearbeiten und durch /etc/hosts
einen eigenen Pfad zu ersetzen .
Zum Beispiel unter Linux:
Wenn Sie nicht verwenden nscd
, kopieren Sie libnss_files.so
an einen Ort Ihrer Wahl wie:
mkdir -p -- ~/lib &&
cp /lib/x86_64-linux-gnu/libnss_files.so.2 ~/lib
(Die gemeinsam genutzte Bibliothek kann sich an einer anderen Stelle befinden, z. B. /lib/libnss_files.so.2
)
Bearbeiten Sie die Kopie nun binär, um sie durch eine Kopie zu ersetzen /etc/hosts
, die der Länge der Kopie entspricht /tmp/hosts
.
perl -pi -e 's:/etc/hosts:/tmp/hosts:g' ~/lib/libnss_files.so.2
Bearbeiten Sie /tmp/hosts
, um den gewünschten Eintrag hinzuzufügen. Und benutze
export LD_LIBRARY_PATH=~/lib
für nss_files
schauen in /tmp/hosts
statt /etc/hosts
.
Stattdessen /tmp/hosts
könnten Sie es auch machen /dev/fd//3
(hier mit zwei Schrägstrichen, so dass die Länge /dev/fd//3
der gleiche ist wie die von /etc/hosts
) und tun
exec 3< ~/hosts
Zum Beispiel, was es unterschiedlichen Befehlen erlauben würde, unterschiedliche hosts
Dateien zu verwenden.
Wenn nscd
es installiert ist und ausgeführt wird, können Sie es umgehen, indem Sie denselben Trick ausführen, aber diesmal libc.so.6
den Pfad zum nscd-Socket (so etwas wie /var/run/nscd/socket
) durch einen nicht vorhandenen Pfad ersetzen .
LD_LIBRARY_PATH
auf ein Verzeichnis verweisen, dessen Eigentümer der Benutzer ist, kann jeder andere vom Benutzer ausgeführte Prozess dieses Verzeichnis verwenden, um alle neuen Prozesse zu übernehmen, die durch das Ersetzen von Bibliotheken entstehen. Und Updates libnss_files.so
über den Paketmanager (einschließlich Sicherheitsupdates) werden in der gepatchten Version nicht berücksichtigt. Das Ändern LD_LIBRARY_PATH
ist im Allgemeinen aus anderen Gründen nicht empfehlenswert, aber aufgrund dieser Probleme auch nicht sinnvoll.
Private Mountspaces, die mit dem unshare
Befehl erstellt wurden, können verwendet werden, um eine private Datei / etc / hosts für einen Shell-Prozess und alle nachfolgenden untergeordneten Prozesse bereitzustellen, die von dieser Shell gestartet werden.
# 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)
und clone(2)
das ist ein Teil der Magie hier. Siehe auch namespaces(7)
und user_namespaces(7)
.
Eine Lösung besteht darin, jeden Benutzer in einem eigenen zu haben chroot
, sodass jeder für sich einen eigenen Benutzer haben kann /etc/hosts
.
Ich hatte das gleiche Bedürfnis, also habe ich libnss-userhosts ausprobiert, aber es schlägt bei Multithread-Anwendungen fehl. Deshalb habe ich libnss-homehosts geschrieben . Es ist sehr neu und nur von mir getestet. Sie können eine Chance dafür geben! Es werden einige Optionen in /etc/host.conf, mehrere Aliasnamen und die umgekehrte Auflösung (von Adresse zu Name) unterstützt.
Folgendes einzutragen ~/.bashrc
funktioniert für mich in der Bash. Es konvertiert den Hostnamen im Befehl in eine Adresse, die auf Einträgen in basiert ~/.hosts
. Falls ~/.hosts
nicht vorhanden oder der Hostname nicht vorhanden ist ~/.hosts
, wird der Befehl wie gewohnt ausgeführt. Dies sollte mit den ursprünglichen Flags der relevanten Funktionen funktionieren und unabhängig davon, wo der Hostname relativ zu den Flags platziert ist, z ping -i 0.5 host1 -c 3
. B. funktioniert. Die ~/.hosts
Datei hat Vorrang vor jedem anderen Speicherort für die Suche nach Hostnamen. Wenn also doppelte Hostnamen vorhanden sind, wird die Adresse in ~/.hosts
verwendet.
$ 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 "$@"
}
Ein Beispiel für ~/.hosts
ist unten angegeben. Es folgt dem gleichen Format wie /etc/hosts
. Kommentare und Leerzeichen werden korrekt behandelt.
$ cat ~/.hosts
# addresses and hostnames
stackexchange.com se
192.168.0.1 host1 # this is host1's address
login-node.inst.ac.uk login
Ich bin mir nicht sicher, ob dies Ihnen helfen würde, aber ich bin hierher gekommen, um nach einer Möglichkeit zu suchen, gespeicherte "Hosts" irgendwo hinzuzufügen, auf die nur mein Benutzer Zugriff hatte.
Ich musste grundsätzlich in der Lage sein, in bestimmte Kästchen in unserem Arbeitsnetzwerk zu sshen, das nur einen Einstiegspunkt hat.
Ich habe meiner .bashrc
Datei Aliase hinzugefügt .
Wenn Sie beispielsweise Folgendes hinzugefügt haben:
alias jrfbox='ssh jason@192.168.6.6'
am unteren Rand Ihres ~/.bashrc
( ~
ist Ihr Home-Verzeichnis). Dann , nachdem Sie sich abmelden und erneut anmelden, können Sie geben jrfbox
, treffen Enter, und es wird eine Verbindung.
man ssh_config
.
~/.bashrc
, gehen Sie einfach source ~/.bashrc
.
. ~/.bashrc