Làm thế nào để sử dụng ntpdate đằng sau một proxy?


49

Có thể sử dụng ntpdate đằng sau proxy HTTP có xác thực không? Trong trường hợp không thể, có phương án nào tốt không?


Hệ điều hành nào vui lòng?
KCotreau

Linux trong trường hợp của tôi (đừng nghĩ nó quan trọng lắm).
Ton van den Heuvel

Nó chỉ quan trọng bởi vì khó tìm thấy bất cứ thứ gì từ xa cho Windows. Tìm kiếm chính tôi đã sử dụng là "NTP qua HTTP", trong trường hợp bạn muốn tìm kiếm thêm.
KCotreau

3
Nếu bạn đứng sau proxy HTTP, điều đó có thể có nghĩa là bạn đang ở trong một công ty và công ty này có thể cung cấp dịch vụ NTP của riêng họ.
Tristan

Câu trả lời:


29

Đây có vẻ như là một trường hợp rõ ràng cho 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.

Tôi không nghĩ rằng tôi đã từng thấy rất nhiều khuyến nghị sử dụng dữ liệu không được xác thực từ internet như là một đối số cho một lời mời sudo.

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


1
Câu trả lời này nên thực sự đứng đầu.
Pi Delport

Tôi đã không quản lý để làm cho nó hoạt động - với mỗi kết hợp, nó sẽ in lỗi về các mã sai. wget trả lời dưới đây không hoạt động.
Hi-Angel

Đã làm việc trên máy Centos6.9 nhưng không có niềm vui. Điều này có vẻ lành mạnh hơn các khuyến nghị khác nhưng nó không tầm thường để khiến nó hoạt động ...
Alfabravo

46

Mở rộng câu trả lời của 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/,//')"

Hãy cẩn thận, điều này sẽ tạo tập tin 'index.html *' trong thư mục hiện tại.
ryenus

Lưu ý rằng phiên bản ngắn nên sử dụng www.google.com vì google.com đang chuyển hướng đến phiên bản đó qua 301 ngay bây giờ với ngày "bị kẹt"
Hansi

Khi tôi đưa ra nhận xét, phản hồi cho lệnh đó đã trả lại một ngày bốn ngày không cập nhật.
Hansi

@ryenus Đây là một câu trả lời tuyệt vời. Nó hoạt động hoàn toàn tốt. Tuy nhiên tôi có một vấn đề khi tôi đặt lệnh này trong một công việc crontab. Phần thời gian của ngày được thực hiện 00:00:00 bất cứ khi nào công việc này chạy. Tôi đã cố gắng để chạy trong một kịch bản shell. Cùng một kết quả.
huzeyfe

@huzeyfe, bạn vui lòng kiểm tra xem việc chuyển proxy để cuộn tròn có hoạt động không?
ryenus

21

Lót

Giả sử biến môi trường http_proxyđược đã được thiết lập :

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

chúng tôi có thể xác minh ngày / giờ lấy trước:

# 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)"    

Ghi chú

Chỉ trong trường hợp, một số tùy chọn có thể cần thiết cho curl:

  • curl -x $proxy

    để đặt rõ ràng máy chủ proxy sẽ sử dụng, khi http_proxybiến môi trường không được đặt, mặc định là giao thức httpvà cổng 1080 ( thủ công ).

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

    để vô hiệu hóa bộ nhớ đệm , đặc biệt là khi được sử dụng trong công việc định kỳ và / hoặc đằng sau máy chủ proxy.

Biểu mẫu thay thế được thử nghiệm với RHEL 6 sử dụng tùy chọn '-u' cho đến nay thay vì nối thêm "Z" vào đầu ra:

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

BTW, google.comđược ưa thích hơn www.google.com, vì các kết quả trước đây trong 301phản hồi chuyển hướng, nhỏ hơn nhiều ( 569so với 20k+ký tự) nhưng vẫn tốt để sử dụng.


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

^ ở trên là wgetphiên bản, mặc dù cá nhân tôi thích sử dụng curl.
ryenus

2
Truyền dữ liệu không được xác nhận từ internet dưới dạng một biến sang một lệnh gọi sudo? Có phải là năm 1999 không?
dfc

2
Hoặc chỉ sử dụng tlsdate và không dựa vào các loại bùn khó chịu như thế này.
dfc

vâng, nó hoạt động với proxy. Tôi cũng đọc câu hỏi
dfc

5

Nếu nó hoàn toàn là một proxy HTTP, thì nó đang sử dụng cổng 80, vì vậy câu trả lời cơ bản là không. NTP sử dụng cổng UDP 123. Nếu đó là máy chủ proxy chung hơn, phục vụ tất cả các cổng, thì có thể.

Có một số chương trình hiện có NTP qua HTTP. Tôi không sử dụng Linux, nhưng cái này có thể làm được:

http://www.rkeene.org/oss/htp/ (vẫn không chắc chắn liệu điều này có làm xác thực hay không).

Tôi không thể tìm thấy một cái cho Windows, nhưng tôi sẽ đăng lại nếu có.


Một lần nữa cho Linux, vì vậy tôi không thể thêm nhiều thứ khác ngoài liên kết: mina86.com/2010/01/16/ntp-over-http Cũng có thể có một cái gì đó mà một trong những thứ này xuất bản: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau

Liên kết NTP qua HTTP rất truyền cảm, cảm ơn vì điều đó!
Ton van den Heuvel

5

Một giải pháp nhanh chóng và bẩn thỉu cho những người đứng sau máy chủ proxy http:

Vị trí của tôi là GMT + 4, tôi có thể kiểm tra thời gian hiện tại từ máy chủ timeapi với url http://www.timeapi.org/utc/in+four+hours , để biết thêm thông tin, vui lòng kiểm tra trang web cho vị trí của bạn.

Để thiết lập ngày & giờ tôi làm:

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 " " )

Bạn có thể lặp lại lệnh nếu lệnh 'thời gian' ban đầu báo cáo giá trị cao ...


Cảm ơn về mẹo này, tôi đã hiểu nó dễ dàng hơn: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"Bạn không cần phải chú ý đến múi giờ nếu hệ điều hành của bạn được đặt chính xác. Linux nhận ra múi giờ được cung cấp trong chuỗi và đặt thời gian hệ thống một cách thích hợp.
Melebius

2

Dịch vụ NTP đang sử dụng giao thức UDP để đồng bộ hóa thời gian. Vì vậy, HTTP / TCP proxy có thể không hoạt động cho nó. Thay thế cho câu trả lời được chấp nhận, có một công cụ htpdate tốt để đồng bộ hóa thời gian đằng sau proxy.

Một ví dụ về công việc định kỳ:

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

2

Mặc dù ntp trên http đã được đề cập, tôi ngạc nhiên khi không ai đề cập đến tiện ích nhỏ tiện lợi htpdatenhư có sẵn trên http://www.vervest.org/htp/ . Không giống như các giải pháp thay thế, htpdatelà một phần của kho lưu trữ mặc định của Debian và Ubuntu và có thể được cài đặt bằng cách sử dụng apt-get.

Nó có thể chạy cả hai như một lệnh thông thường hoặc âm thầm trong chế độ daemon.


Kiểm tra câu trả lời của tôi ở trên.
artificerpi

1

Giả sử http_proxybiến môi trường được đặt:

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

Hoặc dùng curl -I --proxy="..." "http://www.google.com/"

Rốt cuộc, nếu trang web của Google không đặt thời gian thì sẽ không có hy vọng.


1

Mở rộng trên https://superuser.com/a/509620/362156

Giả sử bạn đang ở Berlin (Đức).

Sau đó sử dụng:

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/,//')")"

Bạn nên giải thích những gì khác biệt trong giải pháp của bạn so với câu trả lời của fiford_g.
pabouk

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.