วิธีรับชื่อแบบเต็ม (FQN) บน Unix ในสคริปต์ทุบตี


15

ฉันได้ทดสอบhostnameกับเซิร์ฟเวอร์หลายตัว (RedHat, Ubuntu) และhostname -fได้พิสูจน์แล้วว่าไม่น่าเชื่อถือบางครั้งจะส่งคืนชื่อสั้น ๆ เท่านั้น (ตามที่อธิบายไว้ในคำถามนี้ )

ฉันสามารถเห็น fqn ในนามแฝง: hostname -a(หนึ่งในนามแฝงคือ fqn ที่ฉันมองหา) แต่ลำดับของนามแฝงไม่ได้รับการแก้ไข

มีวิธีอื่นในการรับชื่อที่ผ่านการรับรองโดยสมบูรณ์และเก็บไว้ในตัวแปร bash หรือไม่?


หากบางครั้ง CNAME คือสิ่งที่คุณกำลังค้นหาไม่ใช่ระเบียน A คุณจะทราบได้อย่างไรว่า FQN "ถูกต้อง" คืออะไร
นิลส์

คำตอบ:


11

ฉันลองสิ่งนี้บน CentOS5:

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

ฉันต้องสอบถาม DNS ของฉันในโหมด TCP หาก UDP ทำงานในสภาพแวดล้อมการทำงานของคุณให้เว้นตัวเลือก "T"


หมายเหตุ: สำหรับแขกของ Ubuntu (VirtualBox) มันจะไม่ทำงาน:

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

ดังนั้นเพื่อครอบคลุมทุกกรณี:

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

1
ฉันhost -TtA $(hostname -s)|grep "has address"|awk '{print $1}'ทำงานกับเซิร์ฟเวอร์ redhat ของฉัน
VonC

สิ่งนี้ใช้ได้กับ mac osx 10.11.6 แต่ให้หนึ่งบรรทัดต่อ IP แต่ไม่ใช่ใน osx 10.12.1 ฉันไม่แน่ใจว่ามันล้มเหลวใน v12 เนื่องจากการตั้งค่าเครื่องของฉันหรือโดยเนื้อแท้
AnneTheAgile

อัปเดต; สำหรับ mac ที่ใช้ AD LDAP วิธีที่ง่ายที่สุดคือการแยกวิเคราะห์: dsconfigad -show
AnneTheAgile

5

นี่เป็นวิธีหนึ่งที่ฉันพบ fqn:

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

กล่าวอีกนัยหนึ่งฉันต้องไปยังnslookupที่อยู่ IP ซึ่งทำให้ฉันชอบ:

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

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

จากนั้นมันก็เป็นแค่คำถามของการเอาสิ่งที่ฉันไม่ต้องการผ่านกิจวัตรสตริงทุบตี

อาจจะมีวิธีที่ง่ายกว่านี้?


5

วิธีการของคุณจะทำงานเฉพาะเมื่อคุณกำหนดค่าชื่อโฮสต์ของคุณอย่างถูกต้องและมีการตั้งค่า dns ที่ถูกต้อง ฯลฯ หากคุณมีทุกอย่างคุณก็รู้ fqdn ของคุณแล้ว

ไม่มีวิธีที่เชื่อถือได้ในการรับ fqdn ที่อยู่ IP เดียวสามารถมี fqdn หลายแห่งและ fqdn เดียวสามารถมีที่อยู่ IP หลายแห่ง ... และ IP จำนวนมากไม่มี fqdn ใด ๆ เลย

หากเครื่องของคุณเชื่อมต่อกับอินเทอร์เน็ตโดยตรงให้ใช้ที่อยู่ IP และทำการร้องขอ DNS ย้อนกลับ: host 1.2.3.4
แต่นี่มักจะไม่ให้คำตอบที่คุณต้องการ (ลองใช้ google เป็นต้น)


จริง แต่ในบริบทของฉัน (องค์กรทั่วโลก) เซิร์ฟเวอร์ทั้งหมดของฉันมี fqn และมีการตั้งค่า dns ที่ถูกต้อง เซิร์ฟเวอร์ที่ฉันต้องการควรมีเพียงหนึ่ง fqdn
VonC

ดังนั้นแยกคำตอบที่hostจะได้รับเพียงบันทึก A (หรือทำการค้นหาตาม)
นิลส์

@ นิล: นั่นดูเหมือนคำแนะนำที่ดี คุณสามารถทำให้มันเป็นคำตอบสำหรับฉันที่จะ upvote และ (หลังการทดสอบ) ยอมรับ?
VonC

4

ไม่ได้hostname --fqdnผลสำหรับคุณ


ไม่ได้ระบุไว้อย่างชัดเจนในคำถาม บนเซิร์ฟเวอร์ฉันต้องรับข้อมูล FQDN hostname --fqdnส่งคืนชื่อแบบย่อพร้อมด้วยfqdn ที่กำหนดเป็นชื่อแทนชื่อโฮสต์อย่างใดอย่างหนึ่ง
VonC

โอ้ใช่ฉันไม่ได้ตระหนัก-fและ--fqdnเป็นสิ่งเดียวกัน
ThatGraemeGuy


2

สำหรับทางเลือกข้ามแพลตฟอร์มถ้าคุณไม่สนใจใช้ python (ทำงานอย่างน้อยใน python 2.7 และ python 3)

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

-1

วิธีการทุบตีอย่างปลอดภัยของ OS X ซึ่งมีแนวโน้มว่าจะไม่ทำงานกับรสชาติอื่น * nix เนื่องจากการเปลี่ยนแปลงในเอาต์พุตคำสั่ง:

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

Python เป็นทางออกที่ดีที่สุดของคุณสำหรับความเข้ากันได้ในวงกว้าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.