Làm cách nào để có được tên đủ điều kiện (FQN) trên Unix trong tập lệnh bash?


15

Tôi đã thử nghiệm hostnametrên một số máy chủ (RedHat, Ubuntu) và hostname -fđã được chứng minh là không đáng tin cậy, đôi khi chỉ trả lại tên ngắn (như được mô tả trong câu hỏi này ).

Tôi có thể thấy fqn trong các bí danh: hostname -a(một trong những bí danh là fqn tôi tìm), nhưng thứ tự của các bí danh không được sửa.

Có cách nào khác để có được tên đầy đủ đáng tin cậy và lưu trữ nó trong một biến bash không?


Nếu đôi khi CNAME là thứ bạn đang tìm kiếm và không phải là bản ghi A, làm sao bạn biết FQN "đúng" là gì?
Nils

Câu trả lời:


11

Tôi đã thử điều này trên CentOS5:

host -TtA $SERVERNAME|grep "has address"|awk '{print $1}'

Tôi phải truy vấn DNS của mình ở chế độ TCP. Nếu UDP hoạt động trong môi trường của bạn, hãy bỏ tùy chọn "T".


Lưu ý: trên máy khách Ubuntu (VirtualBox), nó sẽ không hoạt động:

git@aHostname:~/$ host -TtA $(hostname -s)
Host aHostname not found: 3(NXDOMAIN)

Vì vậy, để bao gồm tất cả các trường hợp:

fqn=$(host -TtA $(hostname -s)|grep "has address"|awk '{print $1}') ; \
if [[ "${fqn}" == "" ]] ; then fqn=$(hostname -s) ; fi ; \
echo "${fqn}"

1
Tôi đã host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'làm việc trên các máy chủ redhat của mình
VonC

Điều này hoạt động trên mac osx 10.11.6, mặc dù cung cấp một dòng trên mỗi IP, nhưng không phải trên osx 10.12.1. Tôi không chắc chắn nếu nó bị lỗi trên v12 do thiết lập máy của tôi hoặc vốn có.
AnneTheAgile

Cập nhật; đối với mac sử dụng AD LDAP, cách dễ nhất là phân tích cú pháp: dsconfigad -show
AnneTheAgile

5

Đây là một cách tôi tìm thấy fqn:

fqn=$(nslookup $(hostname -i)) ; fqn=${fqn##*name = } ; fqn=${fqn%.*} ; echo $fqn

Nói cách khác, tôi đã đến nslookupđịa chỉ IP, cung cấp cho tôi một cái gì đó như:

Server:         128.xxx.yyy.zzz
Address:        128.xxx.yyy.zzz#ww

aa.bb.cc.dd.in-addr.arpa        name = myserver.fully.qualified.name.

Từ đó, đó chỉ là một câu hỏi về việc loại bỏ những gì tôi không muốn, thông qua các thao tác chuỗi bash .

Có lẽ có một cách đơn giản hơn?


5

Phương pháp của bạn chỉ hoạt động nếu bạn đã cấu hình đúng tên máy chủ của mình và có cài đặt dns chính xác, v.v. Nếu bạn có tất cả những điều đó, thì bạn đã biết fqdn của mình.

Không có cách đáng tin cậy để có được fqdn. Một địa chỉ IP duy nhất có thể có một vài fqdn và một fqdn duy nhất có thể có một vài địa chỉ IP ... và rất nhiều IP không có bất kỳ fqd nào cả.

Nếu máy của bạn được kết nối trực tiếp với internet, chỉ cần sử dụng địa chỉ IP và thực hiện yêu cầu DNS ngược: host 1.2.3.4
Nhưng điều này thường không cung cấp cho bạn câu trả lời mong muốn (ví dụ: chỉ thử với google).


Đúng, nhưng trong ngữ cảnh của tôi (doanh nghiệp trên toàn thế giới), tất cả các máy chủ của tôi đều có fqn và có cài đặt dns chính xác. Các máy chủ tôi cần chỉ có một fqdn.
VonC

Vì vậy, phân tích câu trả lời hostđể chỉ nhận bản ghi A (hoặc thực hiện tra cứu theo).
Nils

@Nils: có vẻ là một gợi ý tốt. Bạn có thể làm cho nó một câu trả lời, cho tôi để upvote và (sau khi kiểm tra) chấp nhận?
VonC

4

Không hostname --fqdnlàm việc cho bạn?


Không, như đã nêu rõ trong câu hỏi. Trên các máy chủ tôi phải lấy thông tin FQDN, hostname --fqdntrả về tên ngắn, với fqdn được định nghĩa là một trong những bí danh tên máy chủ.
VonC

Ồ đúng rồi, tôi đã không nhận ra -f--fqdnlà điều tương tự.
ThatGraemeGuy


2

Để thay thế đa nền tảng, nếu bạn không phiền khi sử dụng python (chạy ít nhất trên python 2.7 và python 3)

python -c 'import socket; print(socket.getfqdn())'

-1

Phương thức bash chỉ an toàn cho OS X, có khả năng sẽ không hoạt động với các hương vị * nix khác do các biến thể trong đầu ra lệnh:

fqn=$(nslookup $(hostname) | sed -n s/Name:.//p);

Python có khả năng đặt cược tốt nhất của bạn cho khả năng tương thích rộ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.