Bagaimana cara menggunakan ntpdate di belakang proxy?

49

Apakah mungkin untuk menggunakan ntpdate di belakang proxy HTTP dengan otentikasi? Jika tidak mungkin, apakah ada alternatif yang baik?

Ton van den Heuvel
sumber
OS apa tolong?
KCotreau
Linux dalam kasus saya (tidak berpikir itu sangat berarti).
Ton van den Heuvel
Itu hanya penting karena lebih sulit untuk menemukan sesuatu yang jauh untuk Windows. Pencarian kunci yang saya gunakan adalah "NTP over HTTP", jika Anda ingin mencari lebih lanjut.
KCotreau
3
Jika Anda berada di belakang proxy HTTP, itu mungkin berarti Anda berada di sebuah perusahaan, dan perusahaan ini dapat menyediakan layanan NTP sendiri.
Tristan

Jawaban:

29

Sepertinya ini adalah kasus yang jelas untuk 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.

Saya tidak berpikir saya pernah melihat begitu banyak rekomendasi untuk menggunakan data yang tidak bersih dari internet sebagai argumen untuk permohonan sudo.

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

dfc
sumber
1
Jawaban ini harus benar-benar di atas.
Pi Delport
Saya tidak berhasil membuatnya bekerja - dengan setiap kombinasi itu mencetak kesalahan tentang ticker palsu. wget jawaban di bawah ini berfungsi.
Hi-Angel
Telah mengerjakannya pada mesin Centos6.9 tetapi tidak ada sukacita. Ini tampaknya lebih sehat daripada rekomendasi lain tetapi tidak sepele untuk membuatnya bekerja ...
Alfabravo
46

Memperluas jawaban dengan 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/,//')"
fiford_g
sumber
Peringatan, ini akan membuat file 'index.html *' di direktori saat ini.
ryenus
Perhatikan bahwa versi singkat harus menggunakan www.google.com karena google.com mengarahkannya ke 301 sekarang dengan tanggal "macet"
Hansi
Ketika saya memberikan komentar, respons untuk perintah itu kembali sehari empat hari kedaluwarsa.
Hansi
@ryenus Ini jawaban yang bagus. Ini bekerja dengan sangat baik. Namun saya memiliki masalah ketika saya menempatkan perintah ini di pekerjaan crontab. Bagian waktu tanggal dibuat 00:00:00 setiap kali pekerjaan ini berjalan. Saya mencoba menjalankan skrip shell. Hasil yang sama
huzeyfe
@ huzeyfe, tolong periksa apakah meneruskan proxy ke curl berfungsi?
ryenus
21

Satu Liner

Dengan asumsi variabel lingkungan http_proxyyang sudah diatur :

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

kami dapat memverifikasi tanggal / waktu yang diambil pertama:

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

Catatan

Untuk berjaga-jaga, opsi tertentu mungkin diperlukan untuk curl:

  • curl -x $proxy

    untuk secara eksplisit mengatur server proxy untuk digunakan, ketika http_proxyvariabel lingkungan tidak diatur, standar untuk protokol httpdan port 1080 ( manual ).

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

    untuk secara eksplisit menonaktifkan caching , terutama ketika digunakan dalam pekerjaan cron dan / atau di belakang server proxy.

Formulir alternatif yang diuji dengan RHEL 6 yang menggunakan opsi '-u' untuk tanggal alih-alih menambahkan "Z" ke output:

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

BTW, google.comlebih disukai daripada www.google.com, karena yang sebelumnya menghasilkan 301respons pengalihan, yang jauh lebih kecil ( 569vs 20k+karakter) tetapi masih bagus untuk digunakan.

Ryenus
sumber
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
ryenus
^ di atas adalah wgetversi, meskipun saya pribadi lebih suka menggunakan curl.
ryenus
2
Melewati data yang tidak bersih dari internet sebagai variabel untuk permohonan sudo? Apakah ini tahun 1999?
dfc
2
Atau cukup gunakan tlsdate dan jangan mengandalkan kludges jahat seperti ini.
dfc
ya, ia bekerja dengan proksi. Saya membaca pertanyaan juga.
dfc
5

Jika ini murni proxy HTTP, ia menggunakan port 80, jadi jawaban dasarnya adalah tidak untuk itu secara khusus. NTP menggunakan port UDP 123. Jika itu adalah server proxy yang lebih umum, melayani semua port, maka mungkin.

Ada beberapa program di luar sana yang melakukan NTP melalui HTTP. Saya tidak menggunakan Linux, tetapi yang ini mungkin melakukannya:

http://www.rkeene.org/oss/htp/ (masih belum yakin apakah ini akan melakukan otentikasi juga).

Saya tidak dapat menemukan satu untuk Windows, tetapi saya akan memposting kembali jika saya melakukannya.

KCotreau
sumber
Sekali lagi untuk Linux, jadi saya tidak bisa menambahkan banyak selain tautan: mina86.com/2010/01/16/ntp-over-http Mungkin juga ada sesuatu yang diterbitkan oleh salah satu dari ini: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau
Tautan NTP melalui HTTP menginspirasi, terima kasih untuk itu!
Ton van den Heuvel
5

Solusi cepat dan kotor untuk orang di belakang server proxy http:

Lokasi saya adalah GMT + 4, saya dapat memeriksa waktu saat ini dari server timeapi dengan url http://www.timeapi.org/utc/in+four+hours , untuk info lebih lanjut silakan cek situs web untuk lokasi Anda.

Untuk mengatur tanggal & waktu saya lakukan:

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

Anda dapat mengulangi perintah jika perintah 'waktu' awal melaporkan nilai tinggi ...

Mehdi Amiri
sumber
Terima kasih atas tipnya, saya membuatnya lebih mudah: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"Anda tidak perlu memperhatikan zona waktu jika OS Anda diatur dengan benar. Linux mengenali zona waktu yang disediakan dalam string dan mengatur waktu sistem dengan tepat.
Melebius
2

Layanan NTP menggunakan protokol UDP untuk menyinkronkan waktu. Jadi HTTP / TCP proxy mungkin tidak berfungsi untuk itu. Alternatif untuk jawaban yang diterima, ada alat htpdate yang baik untuk menyinkronkan waktu di belakang proksi.

Contoh pekerjaan cron:

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

Meskipun ntp lebih dari http telah disebutkan, saya terkejut bahwa tidak ada yang menyebutkan utilitas kecil yang bagus htpdateseperti yang tersedia di http://www.vervest.org/htp/ . Berbeda dengan alternatif, htpdateadalah bagian dari repositori default Debian dan Ubuntu dan dapat diinstal menggunakan apt-get.

Itu dapat dijalankan baik sebagai perintah biasa atau diam-diam dalam mode daemon.

tidak deterministik
sumber
Periksa jawaban saya di atas.
artificerpi
1

Dengan asumsi http_proxyvariabel lingkungan diatur:

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

Atau gunakan curl -I --proxy="..." "http://www.google.com/"

Lagi pula, jika situs Google tidak memiliki waktu yang ditetapkan tidak ada harapan.

Ukir
sumber
1

Memperluas pada https://superuser.com/a/509620/362156

Mari kita asumsikan Anda berada di Berlin (Jerman).

Kemudian gunakan ini:

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/,//')")"
PeterZ
sumber
Anda harus menjelaskan apa yang berbeda dalam solusi Anda dibandingkan dengan jawaban oleh fiford_g.
pabouk