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, có 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
Và dòng lệnh để cập nhật một khối được đánh dấu /etc/hosts
bằ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
sed
lệ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/hosts
di 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/hosts
sẽ bắt đầu ghi tệp trong khi nội dung hiện có vẫn đang được đọc.