จะทราบเวลาปัจจุบันจากอินเทอร์เน็ตจาก command line ใน Linux ได้อย่างไร?


26

จะทราบเวลาปัจจุบันจากอินเทอร์เน็ตจาก command line ใน Linux ได้อย่างไร?

ตัวอย่างเช่นกับntpqโปรแกรม?

หมายเหตุ: ไม่ได้มาจากคอมพิวเตอร์หรือนาฬิการะบบปฏิบัติการ แต่มาจากอินเทอร์เน็ต?

หมายเหตุ: ฉันไม่ต้องการเปลี่ยนหรือซิงค์เวลา เพิ่งรู้


คำตอบ:


30

หากคุณใช้ bash บรรทัดต่อไปนี้จะทำงาน

$ cat </dev/tcp/time.nist.gov/13

56525 13-08-21 23:07:09 50 0 0  55.6 UTC(NIST) *

มันใช้ประโยชน์จากความสามารถเครือข่ายในตัวของเชลล์ bash หากคุณใช้ POSIX เชลล์หรือเชลล์อื่น ๆ คุณสามารถใช้เช่นnetcat

$ nc time.nist.gov 13

56525 13-08-21 23:07:09 50 0 0  55.6 UTC(NIST) *

คำสั่งทั้งคู่สอบถามเซิร์ฟเวอร์ตัวจับเวลาบนพอร์ต TCP 13 ของสถาบันมาตรฐานและเทคโนโลยีแห่งชาติและส่งออกข้อมูลที่ได้รับเมื่อ stdout

¹ แก้ไข:จากหน้า Bash man: Bash จัดการชื่อไฟล์หลายชื่อเป็นพิเศษเมื่อใช้ในการเปลี่ยนเส้นทางดังที่อธิบายไว้ในตารางต่อไปนี้:

/dev/tcp/host/port
หากโฮสต์เป็นชื่อโฮสต์หรือที่อยู่อินเทอร์เน็ตที่ถูกต้องและพอร์ตเป็นหมายเลขพอร์ตจำนวนเต็มหรือ ชื่อบริการ bash จะพยายามเปิดการเชื่อมต่อ TCP ไปยังซ็อกเก็ตที่เกี่ยวข้อง

/dev/udp/host/port
หากโฮสต์เป็นชื่อโฮสต์หรือที่อยู่อินเทอร์เน็ตที่ถูกต้องและพอร์ตเป็นหมายเลขพอร์ตจำนวนเต็มหรือ ชื่อบริการ bash จะพยายามเปิดการเชื่อมต่อ UDP กับซ็อกเก็ตที่เกี่ยวข้อง


ดี +1 คุณช่วยขยายการทำงานของมันออกไปหน่อยได้ไหม? หรือเนื่องจากฉันดูเหมือนจะขาดความรู้เรื่องทุบตีขนาดใหญ่ที่นี่ให้ฉันชื่อเพื่อดูพฤติกรรมนี้ขึ้นกับ? อะไรคือสิ่งที่</dev/tcp/รูปแบบ?
terdon

ข้อเสียเล็กน้อยสองประการที่ฉันเห็นด้วยวิธีนี้คือไม่สนับสนุนเขตเวลาที่แตกต่างกันและไม่สามารถระบุรูปแบบได้อย่างตรงไปตรงมา เพื่อแก้ไขสถานการณ์ที่หนึ่งสามารถใช้API เวลา ตัวอย่างเช่นหากต้องการค้นหาเวลาที่แท้จริงสำหรับยุโรปกลางด้วยวิธีที่ชัดเจนกว่ามนุษย์เราเพียงแค่เรียกใช้:curl -G --data-urlencode "format=%D-%T\n" http://www.timeapi.org/cet/now?
Moreaki

ไม่แน่ใจว่า time.nist.gov มีการ จำกัด อัตราหรือมากเกินไป แต่ฉันได้รับผลลัพธ์ที่แตกต่างกับโฮสต์นี้
Snowcrash

22

มีบริการ NTPหลายบริการต่อ distro

หากคุณต้องการทำClocks ครั้งเดียว :

date -s "$(curl -s --head http://google.com | grep ^Date: | sed 's/Date: //g')"

ตั้งเวลาระบบเป็นฮาร์ดแวร์นาฬิกาเรียลไทม์

hwclock -r --utc
hwclock -w --utc
hwclock -r --utc

(หมายเหตุ: สิ่งนี้เกิดขึ้นเพื่อทำงานได้ดีกับ Google เพราะพวกเขามีทั้งห่วงโซ่ทั้งหมด)


หากคุณต้องการดูเวลาที่เซิร์ฟเวอร์ที่ใกล้ที่สุดของ Google ส่งให้:

date -d "$(curl -s --head http://google.com | grep ^Date: | sed 's/Date: //g')"

17

ntpdateคำสั่งสามารถทำเช่นนี้กับ-qธง:

$ ntpdate -q 1.debian.pool.ntp.org
server 88.191.120.99, stratum 3, offset -0.015076, delay 0.06604
server 88.191.235.218, stratum 2, offset -0.000676, delay 0.06592
server 188.165.240.21, stratum 3, offset 0.001191, delay 0.07005
server 91.121.34.166, stratum 2, offset 0.000565, delay 0.06998
22 Aug 00:56:21 ntpdate[31373]: adjust time server 88.191.235.218 offset -0.000676 sec

จากman ntpdate:

   -q     Query only - don't set the clock.

0

คุณสามารถรับเวลาผ่านอินเทอร์เน็ตโดยใช้ HTTP โดยใช้HTPซึ่งมีอยู่ในหลายระบบhtpdateซึ่งโดยปกติจะมีความแม่นยำเพียงวินาทีที่ใกล้ที่สุดหรือคุณสามารถขอรับได้โดยใช้ TLS tlsdateซึ่งสามารถให้ความแม่นยำที่ดีกว่า:

tlsdate -nV google.com

นอกจากนี้เนื่องจาก ntpdate กำลังเลิกใช้คุณสามารถใช้sntp(ติดตั้งโดยค่าเริ่มต้นใน MacOS และมาเป็นส่วนหนึ่งของการกระจาย ntp) เพื่อให้ได้วันที่ที่แม่นยำยิ่งขึ้น:

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