Bagaimana cara mendapatkan nama yang sepenuhnya memenuhi syarat (FQN) di Unix dalam skrip bash?

15

Saya telah menguji hostnamepada beberapa server (RedHat, Ubuntu), dan hostname -ftelah terbukti tidak dapat diandalkan, kadang-kadang mengembalikan nama pendek saja (seperti yang dijelaskan dalam pertanyaan ini ).

Saya bisa melihat fqn di alias: hostname -a(salah satu alias adalah fqn yang saya cari), tetapi urutan alias tidak diperbaiki.

Apakah ada cara lain untuk mendapatkan nama yang sepenuhnya memenuhi syarat andal, dan menyimpannya dalam variabel bash?

VONC
sumber
Jika terkadang CNAME adalah yang Anda cari dan bukan A-record, bagaimana Anda tahu mana yang merupakan FQN "benar"?
Nils

Jawaban:

11

Saya mencoba ini di CentOS5:

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

Saya harus menanyakan DNS saya dalam Mode-TCP. Jika UDP berfungsi di lingkungan Anda, tinggalkan opsi "T".


Catatan: pada tamu Ubuntu (VirtualBox) itu tidak akan berfungsi:

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

Jadi untuk mencakup semua kasus:

fqn=$(host -TtA $(hostname -s)|grep "has address"|awk '{print $1}') ; \
if [[ "${fqn}" == "" ]] ; then fqn=$(hostname -s) ; fi ; \
echo "${fqn}"
Nils
sumber
1
Saya mulai host -TtA $(hostname -s)|grep "has address"|awk '{print $1}'mengerjakan server redhat saya
VonC
Ini berfungsi pada mac osx 10.11.6, meskipun memberikan satu baris per IP, tetapi tidak pada osx 10.12.1. Saya tidak yakin apakah itu gagal pada v12 karena pengaturan mesin saya atau secara inheren.
AnneTheAgile
Memperbarui; untuk mac menggunakan AD LDAP, cara termudah adalah mengurai: dsconfigad
-show
5

Inilah salah satu cara saya menemukan fqn:

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

Dengan kata lain, saya harus ke nslookupalamat IP, yang memberi saya sesuatu seperti:

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

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

Dari sana, itu hanya pertanyaan untuk menghapus apa yang tidak saya inginkan, melalui manipulasi string bash .

Mungkin ada cara yang lebih sederhana?

VONC
sumber
5

Metode Anda hanya berfungsi jika Anda telah mengkonfigurasi nama host Anda dengan benar, dan memiliki pengaturan dns yang benar, dll. Jika Anda memiliki semua itu, maka Anda sudah tahu fqdn Anda.

Tidak ada cara yang dapat diandalkan untuk mendapatkan fqdn. Satu alamat IP dapat memiliki beberapa fqdn, dan satu fqdn dapat memiliki beberapa alamat IP ... dan banyak IP tidak memiliki fqdn sama sekali.

Jika mesin Anda terhubung langsung ke internet, cukup gunakan alamat IP dan buat permintaan DNS terbalik: host 1.2.3.4
Tetapi ini sangat sering tidak memberi Anda jawaban yang diinginkan (coba saja dengan google misalnya).

Gregory MOUSSAT
sumber
Benar, tetapi dalam konteks saya (perusahaan di seluruh dunia), semua server saya memiliki fqn, dan memiliki pengaturan dns yang benar. Server yang saya butuhkan hanya memiliki satu fqdn.
VonC
Jadi uraikan jawaban hostuntuk hanya mendapatkan A-record (atau melakukan pencarian yang sesuai).
Nils
@Nils: sepertinya saran yang bagus. Bisakah Anda menjawabnya, untuk saya pilih dan (setelah tes) terima?
VonC
4

Tidak hostname --fqdnbekerja untukmu

ThatGraemeGuy
sumber
Tidak, sebagaimana dinyatakan dengan jelas dalam pertanyaan. Di server saya harus mendapatkan informasi FQDN, hostname --fqdnmengembalikan nama pendek, dengan fqdn didefinisikan sebagai salah satu alias hostname.
VonC
Oh benar, saya tidak menyadari -fdan --fqdnmerupakan hal yang sama.
ThatGraemeGuy
2

Di Ubuntu, Anda bisa melakukannya hostname -A

oarevalo
sumber
2

Untuk alternatif lintas-platform, jika Anda tidak keberatan menggunakan python (berjalan setidaknya di python 2.7 dan python 3)

python -c 'import socket; print(socket.getfqdn())'
jakub.g
sumber
-1

Metode OS X safe bash only, yang kemungkinan tidak akan berfungsi dengan rasa * nix lain karena variasi dalam output perintah:

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

Python kemungkinan adalah taruhan terbaik Anda untuk kompatibilitas luas.

Joshua See
sumber