วิธีใช้ ntpdate หลังพร็อกซี


49

เป็นไปได้ไหมที่จะใช้ ntpdate หลังพร็อกซี HTTP ที่มีการตรวจสอบสิทธิ์ ในกรณีที่เป็นไปไม่ได้มีทางเลือกที่ดีอีกไหม?


สิ่งที่ระบบปฏิบัติการโปรด?
KCotreau

Linux ในกรณีของฉัน (อย่าคิดว่าสำคัญมาก)
Ton van den Heuvel

มันสำคัญเพราะมันยากที่จะหาอะไรจากระยะไกลสำหรับ Windows การค้นหาที่สำคัญที่ฉันใช้คือ "NTP ผ่าน HTTP" ในกรณีที่คุณต้องการค้นหาเพิ่มเติม
KCotreau

3
หากคุณอยู่หลังพร็อกซี HTTP อาจเป็นเพราะคุณอยู่ใน บริษัท และ บริษัท นี้อาจให้บริการ NTP ของตัวเอง
อุโมงค์

คำตอบ:


29

นี่เป็นกรณีที่ชัดเจนสำหรับ tlsdate

 tlsdate: secure parasitic rdate replacement

  tlsdate sets the local clock by securely connecting with TLS to remote
  servers and extracting the remote time out of the secure handshake. Unlike
  ntpdate, tlsdate uses TCP, for instance connecting to a remote HTTPS or TLS
  enabled service, and provides some protection against adversaries that try
  to feed you malicious time information.

ฉันไม่คิดว่าฉันเคยเห็นคำแนะนำมากมายในการใช้ข้อมูลที่ไม่ได้รับการแก้ไขจากอินเทอร์เน็ตเป็นข้อโต้แย้งในการขอร้อง sudo

Github: https://github.com/ioerror/tlsdate


1
คำตอบนี้ควรจะอยู่ที่ด้านบนสุด
Pi Delport

ฉันไม่ได้จัดการเพื่อให้มันทำงานได้ทุกครั้งที่มันพิมพ์ข้อผิดพลาดเกี่ยวกับทิกเกอร์เท็จ รับคำตอบด้านล่างใช้งานได้
Hi-Angel

มีการทำงานออกมาบนเครื่อง Centos6.9 แต่ไม่มีความสุข ดูเหมือนว่าจะมีสุขภาพดีกว่าคำแนะนำอื่น ๆ แต่มันก็ไม่สำคัญที่จะทำให้มันใช้งานได้ ...
Alfabravo

46

ขยายคำตอบโดย carveone :

sudo date -s "$(wget -S  "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 ,"GMT", $4 }' | sed 's/,//')"

ข้อสังเกตนี้จะสร้างไฟล์ 'index.html *' ในไดเรกทอรีปัจจุบัน
ryenus

โปรดทราบว่าเวอร์ชันย่อควรใช้ www.google.com เนื่องจาก google.com กำลังเปลี่ยนเส้นทางไปยัง 301 ผ่านทางวันที่ "ติดขัด"
Hansi

เมื่อฉันแสดงความคิดเห็นการตอบสนองสำหรับคำสั่งนั้นคืนหนึ่งวันสี่วัน
Hansi

@ryenus นี่คือคำตอบที่ดี มันใช้งานได้ดีอย่างสมบูรณ์แบบ อย่างไรก็ตามฉันมีปัญหาเมื่อฉันใส่คำสั่งนี้ในงาน crontab ส่วนเวลาของวันที่ทำเวลา 00:00:00 ทุกครั้งที่งานนี้ดำเนินการ ฉันพยายามเรียกใช้ในเชลล์สคริปต์ ผลลัพธ์เดียวกัน
huzeyfe

@huzeyfe คุณช่วยกรุณาตรวจสอบว่าผ่าน proxy เพื่อ curlทำงานหรือไม่
ryenus

21

หนึ่งในสายการบิน

สมมติตัวแปรสภาพแวดล้อมhttp_proxyเป็นที่ตั้งแล้ว :

sudo date -s "$(curl -H'Cache-Control:no-cache' -sI google.com | grep '^Date:' | cut -d' ' -f3-6)Z"

เราสามารถตรวจสอบวันที่ / เวลาที่ดึงข้อมูลได้ก่อน:

# local  date/time
date -d "$(curl -HCache-Control:no-cache -sI google.com | grep '^Date:' | cut -d' ' -f3-6)Z"

# or UTC date/time
date -ud "$(curl -HCache-Control:no-cache -sI google.com | grep '^Date:' | cut -d' ' -f3-6)"    

หมายเหตุ

ในกรณีที่อาจจำเป็นต้องใช้ตัวเลือกบางอย่างสำหรับcurl:

  • curl -x $proxy

    เพื่อตั้งค่าพร็อกซีเซิร์ฟเวอร์ให้ใช้อย่างชัดเจนเมื่อhttp_proxyไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมเริ่มต้นที่โปรโตคอลhttpและพอร์ต1080 ( ด้วยตนเอง )

  • curl -H 'Cache-Control: no-cache'

    เพื่อปิดใช้งานการแคชอย่างชัดเจนโดยเฉพาะเมื่อใช้ในงาน cron และ / หรือหลังพร็อกซีเซิร์ฟเวอร์

แบบฟอร์มสำรองที่ทดสอบด้วย RHEL 6 ที่ใช้ตัวเลือก '-u' ถึงวันที่แทนการต่อท้าย "Z" ไปยังเอาต์พุต:

sudo date -u --set="$(curl -H 'Cache-Control: no-cache' -sD - http://google.com |grep '^Date:' |cut -d' ' -f3-6)"

BTW นั้นgoogle.comเป็นที่นิยมมากกว่าwww.google.comเพราะในอดีตผลลัพธ์ในการ301ตอบสนองการเปลี่ยนเส้นทางซึ่งมีขนาดเล็กกว่ามาก ( 569เทียบกับ20k+ตัวอักษร) แต่ก็ยังใช้ได้ดี


sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
ryenus

^ ข้างต้นเป็นรุ่นแม้ว่าผมเองชอบใช้wget curl
ryenus

2
การส่งผ่านข้อมูลที่ไม่ได้รับอนุญาตจากอินเทอร์เน็ตเป็นตัวแปรไปยังการเรียกใช้ sudo? มันคือ 1999
dfc

2
หรือเพียงแค่ใช้ tlsdate และไม่ต้องพึ่งพากากที่น่ารังเกียจเช่นนี้
dfc

ใช่มันใช้ได้กับพร็อกซี่ ฉันอ่านคำถามด้วย
dfc

5

หากเป็นพร็อกซี HTTP ล้วน ๆ กำลังใช้พอร์ต 80 ดังนั้นคำตอบพื้นฐานนั้นไม่เฉพาะเจาะจง NTP ใช้พอร์ต UDP 123 หากเป็นพร็อกซีเซิร์ฟเวอร์ทั่วไปที่ให้บริการพอร์ตทั้งหมด

มีบางโปรแกรมที่ทำ NTP ผ่าน HTTP ฉันไม่ได้ใช้ Linux แต่อันนี้อาจทำ:

http://www.rkeene.org/oss/htp/ (ยังไม่แน่ใจว่าจะทำการพิสูจน์ตัวตนด้วยหรือไม่)

ฉันไม่สามารถหาหนึ่งสำหรับ Windows แต่ฉันจะโพสต์กลับถ้าฉันทำ


อีกครั้งสำหรับ Linux ดังนั้นฉันจึงไม่สามารถเพิ่มลิงค์อื่น ๆ ได้อีก: mina86.com/2010/01/16/ntp-over-httpอาจมีบางอย่างที่หนึ่งในเหล่านี้เผยแพร่: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau

ลิงค์ NTP ผ่าน HTTP นั้นสร้างแรงบันดาลใจขอบคุณมาก!
Ton van den Heuvel

5

วิธีการแก้ปัญหาที่รวดเร็วและสกปรกสำหรับผู้ที่อยู่เบื้องหลังพร็อกซีเซิร์ฟเวอร์ http:

ตำแหน่งของฉันคือ GMT + 4 ฉันสามารถตรวจสอบเวลาปัจจุบันจากเซิร์ฟเวอร์ timeapi ด้วย url http://www.timeapi.org/utc/in+four+hoursสำหรับข้อมูลเพิ่มเติมกรุณาชำระเงินเว็บไซต์สำหรับตำแหน่งของคุณ

ในการตั้งค่าวันที่ & เวลาฉัน:

time sudo date $(wget -O - "http://www.timeapi.org/utc/in+four+hours" 2>/dev/null | sed s/[-T:+]/\ /g | awk '{print $2,$3,$4,$5,".",$6}' | tr -d " " )

คุณสามารถทำซ้ำคำสั่งหากคำสั่ง 'เวลา' เริ่มต้นรายงานมูลค่าสูง ...


ขอบคุณสำหรับเคล็ดลับฉันเข้าใจง่ายยิ่งขึ้น: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"คุณไม่จำเป็นต้องใส่ใจกับเขตเวลาหากตั้งค่าระบบปฏิบัติการของคุณอย่างถูกต้อง Linux รู้จักเขตเวลาที่ระบุในสตริงและตั้งเวลาของระบบอย่างเหมาะสม
Melebius

2

บริการ NTP ใช้โปรโตคอล UDP เพื่อซิงค์เวลา ดังนั้นพร็อกซี HTTP / TCP อาจไม่ทำงาน ทางเลือกสำหรับคำตอบที่ยอมรับมีเครื่องมือhtpdateที่ดีในการซิงค์เวลาหลังพร็อกซี

ตัวอย่างงาน cron:

* 3 * * * /usr/bin/htpdate -s -P <PROXY_HOST>:<PROXY__PORT> www.linux.org www.freebsd.org

2

แม้ว่า NTP ผ่าน HTTP ได้รับการกล่าวถึงฉันประหลาดใจที่ไม่มีใครกล่าวถึงยูทิลิตี้เล็ก ๆ น้อย ๆ ที่ดีhtpdateที่สุดเท่าที่มีอยู่บนhttp://www.vervest.org/htp/ ซึ่งแตกต่างจากทางเลือกที่htpdateเป็นส่วนหนึ่งของ Debian และ Ubuntu apt-getของที่เก็บค่าเริ่มต้นและสามารถติดตั้งได้โดยใช้

มันสามารถเรียกใช้ทั้งสองเป็นคำสั่งธรรมดาหรือเงียบ ๆ ในโหมด daemon


ตรวจสอบคำตอบของฉันด้านบน
artificerpi

1

สมมติว่าhttp_proxyตัวแปรสภาพแวดล้อมถูกตั้งค่า:

wget -S --spider "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'

หรือใช้ curl -I --proxy="..." "http://www.google.com/"

ท้ายที่สุดถ้าเว็บไซต์ของ Google ไม่มีเวลาที่กำหนดก็ไม่มีความหวัง


1

ขยายตัวในhttps://superuser.com/a/509620/362156

สมมติว่าคุณอยู่ในเบอร์ลิน (เยอรมนี)

จากนั้นใช้สิ่งนี้:

sudo TZ=Europe/Berlin date -s "$(TZ=Europe/Berlin date --date='TZ="UTC" '"$(wget -S  "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 , $6, $4 }' | sed 's/,//')")"

คุณควรอธิบายสิ่งที่แตกต่างในโซลูชันของคุณเปรียบเทียบกับคำตอบโดย fiford_g
pabouk

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