/ etc / hostsを補完するためにユーザー固有のホストファイルを作成できますか?

/ etc / hostsを補完するためにユーザー固有のホストファイルを作成できますか?

特定のユーザーにのみ該当するホストのリストを追加できますか?たぶんユーザー固有のホストファイルですか?

メカニズムは文書の項目も補完する必要があります/etc/hosts

答え1

あなたが探している機能はglibcに実装されています。環境変数を設定してカスタムホストファイルを定義できますHOSTALIASES。このファイルの名前は次のように置き換えられますgethostbyname(参照:文書)。

はい(Ubuntu 13.10でテスト済み):

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

いくつかの制限事項:

  • HOSTALIASESgetaddrinfo(3)またはを使用しているアプリケーションでのみ使用できます。gethostbyname(3)
  • ~のため設定値/設定/セットキャップアプリケーション内では、libcは環境をクリーンアップするため、設定がHOSTALIASES失われます。平らなsetuid ルートであるか、net_raw実行時にアクティブになるため (ICMP パケットを受信する必要があるため)HOSTALIASES呼び出す前に既にルートでなければ動作しません。pingping

答え2

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

を除いて、(ここで2つのスラッシュを使用しての長さがの長さと等しくなるように)/tmp/hosts作成することもできます。/dev/fd//3/dev/fd//3/etc/hosts

exec 3< ~/hosts

たとえば、これにより、異なるコマンドで異なるファイルを使用できますhosts

インストールして実行している場合は、nscd同じ方法で問題を解決できますが、今回はlibc.so.6nscdソケットへのパス(たとえば/var/run/nscd/socket)を存在しないパスに置き換えます。

答え3

このコマンドで作成されたプライベートマウントスペースは、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

答え4

1つの解決策は、各ユーザーを別々のユーザーとして指定して、chroot各ユーザーが独自の別々のユーザーを持つことを可能にすることです/etc/hosts

関連情報