/ etc / hosts tập tin tham khảo tập tin cấu hình khác


38

Làm cách nào tôi có thể lấy /etc/hoststệp để tham khảo tệp cấu hình khác cho danh sách máy chủ lưu trữ?

Ví dụ /etc/hosts:

 ## My Hosts
 127.0.0.1   localhost
 255.255.255.255 broadcasthost

 #Other Configurations
 <Link to /myPath/to/MyConfig/ConfigFile.txt>

 #Other Addresses
 3.3.3.3 MyAwesomeDomain.com
 4.4.4.4 SomeplaceIWantToGoTo.com

ConfigFile.txt

##My additional Hosts
1.1.1.1 SomeLocation.com
2.2.2.2 AnotherLocation.com

Làm cách nào để thêm một liên kết / Tham chiếu đến /etc/hoststệp sao cho ConfigFile.txt sẽ được tải?

Câu trả lời:


40

Bạn không thể. Định dạng cho /etc/hostskhá đơn giản và không hỗ trợ bao gồm các tệp bổ sung.

Thay vào đó, có một vài cách bạn có thể sử dụng:

  • Thiết lập máy chủ DNS (có thể chỉ cục bộ). Một số trong số này cung cấp rất nhiều tính linh hoạt và bạn chắc chắn có thể trải rộng các tệp máy chủ của mình trên nhiều tệp hoặc thậm chí cả máy. Những người khác (như dnsmasq) cung cấp ít linh hoạt (nhưng vẫn đủ), nhưng rất dễ thiết lập. Nếu bạn đang cố gắng đưa cùng một danh sách máy chủ vào một loạt các máy thì DNS có lẽ là câu trả lời đúng.

  • Thiết lập một số dịch vụ tên khác (NIS, LDAP, v.v.). Kiểm tra tài liệu NSS của glibc để biết những gì được hỗ trợ. Cá nhân, tôi nghĩ bạn nên sử dụng DNS trong hầu hết các trường hợp.

  • Tạo cho mình một /etc/hosts.dthư mục hoặc tương tự, và viết một số tập lệnh để ghép tất cả chúng lại với nhau (tầm thường nhất: cat /etc/hosts.d/*.conf > /etc/hostsmặc dù bạn có thể muốn tốt hơn một chút, ví dụ, ghi đè sắp xếp mặc định theo ngôn ngữ hiện tại) và chạy tập lệnh đó khi khởi động, hoặc từ cron hoặc thủ công bất cứ khi nào bạn cập nhật các tập tin.

Cá nhân, ở cả nhà và nơi làm việc, để có thể phân giải tên máy từ mọi thiết bị, tôi chạy BIND 9. Tuy nhiên, điều đó liên quan đến một vài giờ để tìm hiểu.


Cảm ơn! Tôi đã tự hỏi tại sao mỗi lần thử đều thất bại. Sẽ dễ dàng hơn nhiều nếu có thể, nhưng tôi sẽ sử dụng /etc/hosts.d
DogEatDog

8
@DogEatDog Tôi khuyên bạn nên chạy máy chủ DNS cục bộ. Dnsmasq rất dễ thiết lập; trên các bản phân phối thân thiện với người dùng, bạn cài đặt gói và nó chỉ hoạt động.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles có quyền - dnsmasq có thể thực hiện chính xác những gì bạn muốn trên mạng gia đình. Nó cho phép bạn gán IP tĩnh cho tất cả tài nguyên mạng LAN của mình theo địa chỉ MAC, cấp cho chúng tên máy chủ và giải quyết các yêu cầu cho chúng - tất cả trong khi cho phép các máy chủ không xác định chuyển qua máy chủ DNS ngược dòng.
psychboom

@moodboom & Gilles Cảm ơn bạn đã gợi ý rằng, tôi đã lưu ý nó trong câu trả lời. Không chắc chắn nếu tôi đã sử dụng dnsmasq vào năm 2013, nhưng tôi chắc chắn là bây giờ.
derobert

Mở rộng Glob được sắp xếp (ít nhất là trong Bash, theo LC_COLLATE), do đó, cảnh báo trong câu trả lời của bạn không áp dụng.
l0b0

2

Không thể, vì định dạng thường được mã hóa sâu vào libc của nền tảng. Tuy nhiên, thể tưởng tượng rằng một hệ điều hành bổ sung tính năng này, làm cho nó trở thành một giải pháp không đa nền tảng.

Ngoài ra, bạn có thể tự động cập nhật một khối nhất định trong tệp máy chủ của mình. Điều này đặc biệt hữu ích nếu bạn có một tập lệnh tự động xuất các mục nhập máy chủ cho một dự án nhất định hoặc có thể (có thể thay đổi IP).

Đây là một ví dụ: bạn muốn tạo máy chủ từ trạng thái Terraform thông qua terraform-inventory.

Đầu ra khoảng không quảng cáo có liên quan (ví dụ: ánh xạ thẻ "Tên" EC2 thành các nhóm của một máy chủ chính xác mỗi máy chủ):

$ terraform-inventory --list | jq 'with_entries(select(.key | match("^name_")))'
{
  "name_myhost-a": [
    "10.101.118.131"
  ],
  "name_myhost-b": [
    "10.101.111.189"
  ]
}

print-updated-hosts-entries.sh

#!/bin/sh
exec terraform-inventory --list | \
    jq -r 'to_entries |
           map(select(.key | match("^name_"))) |
           map(.value[0] + " " + .key[5:]) |
           join("\n")'

Đầu ra tập lệnh:

./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b

dòng lệnh để cập nhật một khối được đánh dấu /etc/hostsbằng đầu ra tập lệnh :

sudo cp /etc/hosts "/etc/hosts.bak.$(date +%Y%m%d%H%M%S)" && \
    (
        sed -n '1,/^# MYMARKER BEGIN/{/^# MYMARKER BEGIN/!p;}' /etc/hosts; \
        echo "# MYMARKER BEGIN"; \
        ./print-updated-hosts-entries.sh; \
        echo "# MYMARKER END"; \
        sed -n '/^# MYMARKER END/,${/^# MYMARKER END/!p;}' /etc/hosts; \
    ) | \
    sudo tee /etc/hosts.new | \
    sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' && \
        sudo mv /etc/hosts.new /etc/hosts

Giải trình:

  • Dòng đầu tiên rõ ràng tạo ra một bản sao lưu
  • Subshell trong ngoặc đơn có hai sedlệnh gọi để in tất cả các dòng trước và sau điểm đánh dấu bắt đầu / kết thúc, tương ứng. Chúng tôi chèn các điểm đánh dấu trong mọi trường hợp, đặt đầu ra tập lệnh ở giữa các dòng đó. Ngay cả khi kịch bản thất bại, chúng ta vẫn phải xoay quanh nội dung của /etc/hosts(và bản sao lưu trong một kịch bản thảm khốc).
  • sudo tee /etc/hosts.new ghi nội dung đường ống vào một tệp mới
  • sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' in khối cập nhật cho thuận tiện
  • sudo mv /etc/hosts.new /etc/hostsdi chuyển các tập tin mới vào vị trí. Điều này phải được thực hiện trong một bước riêng vì nếu bộ đệm ống hết dung lượng, tee /etc/hostssẽ bắt đầu ghi tệp trong khi nội dung hiện có vẫn đang được đọc.

1

Tôi đã có một yêu cầu tương tự đối với tôi để làm việc liền mạch từ các vị trí khác nhau với IP động, đặc biệt là khi tôi sử dụng máy ảo. Giải pháp đơn giản của tôi cho việc này là như sau:

  1. Tạo một tập lệnh để cập nhật các mục lưu trữ cho mỗi thực thể. Ví dụ: nếu tôi có một máy chủ được gọi là 'myhost.net', với tên miền phụ 'app.myhost.net', tôi sẽ gọi tập lệnh đó và cung cấp một địa chỉ IP sẽ được ghi cho mỗi tên miền và được lưu trong tệp lưu trữ được gọi là 'chủ nhà của tôi'. Kịch bản tương tự có một cờ để xóa hoặc cập nhật một tệp máy chủ.

  2. Tạo một tập lệnh khác để hợp nhất các tệp đó vào / etc / hosts. Tập lệnh này sẽ tìm tất cả các tệp máy chủ bạn đã tạo và hợp nhất chúng vào tệp máy chủ duy nhất tại / etc / hosts.

Điều này đã làm việc cho tôi hoàn hảo. Tôi làm việc từ xa và đôi khi cần phải di chuyển giữa các vị trí vì bất kỳ lý do nào khác, và sẽ bị gánh nặng bởi nhu cầu chỉnh sửa một tệp đó rất nhiều lần. Thay vào đó tôi chỉ chạy MỘT kịch bản. Vâng, một kịch bản. Tập lệnh đầu tiên tự động chạy tập lệnh khác để thực hiện việc hợp nhất tự động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.