Comment utiliser ntpdate derrière un proxy?

49

Est-il possible d'utiliser ntpdate derrière un proxy HTTP avec authentification? Si ce n’est pas possible, existe-t-il de bonnes alternatives?

Ton van den Heuvel
la source
Quel OS s'il vous plaît?
KCotreau
Linux dans mon cas (ne pense pas que cela compte beaucoup).
Ton van den Heuvel
Cela importait seulement parce qu'il était plus difficile de trouver quoi que ce soit à distance pour Windows. La recherche de clé que j'ai utilisée était "NTP over HTTP", au cas où vous voudriez chercher plus loin.
KCotreau
3
Si vous êtes derrière un proxy HTTP, cela signifie probablement que vous êtes dans une entreprise et que cette entreprise peut fournir ses propres services NTP.
Tristan

Réponses:

29

Cela semble être un cas clair pour cette date.

 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.

Je ne pense pas avoir jamais vu autant de recommandations d'utiliser des données non normalisées provenant d'Internet comme argument d'une invocation sudo.

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

dfc
la source
1
Cette réponse devrait vraiment être au top.
Pi Delport
Je n'ai pas réussi à le faire fonctionner - avec chaque combinaison, cela génère des erreurs concernant les faux tickers. wget réponse ci-dessous fonctionne.
Bonjour Angel
Ont travaillé sur une machine Centos6.9 mais pas de joie. Cela semble plus sain que d’autres recommandations, mais il n’est pas anodin de le faire fonctionner ...
Alfabravo
46

Développer la réponse par 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
la source
Attention, cela créerait le fichier 'index.html *' dans le répertoire actuel.
ryenus
Notez que la version courte doit utiliser www.google.com puisque google.fr y redirige maintenant via la date 301 avec la date "bloquée"
Hansi
Lorsque j'ai fait ce commentaire, la réponse à cette commande a renvoyé un jour obsolète quatre jours plus tard.
Hansi
@ryenus C'est une excellente réponse. Cela fonctionne parfaitement bien. Cependant, j'ai un problème lorsque je mets cette commande dans un travail crontab. La partie heure de la date est créée à 00:00:00 à chaque exécution de ce travail. J'ai essayé de courir dans un script shell. Même résultat.
huzeyfe
@huzeyfe, voudriez-vous s'il vous plaît vérifier si passer proxy par curl fonctionne?
Ryenus
21

Bon mot

En supposant que la variable d’environnement http_proxysoit déjà définie :

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

nous pouvons d'abord vérifier la date / heure récupérée:

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

Remarques

Juste au cas où, certaines options pourraient être nécessaires pour curl:

  • curl -x $proxy

    pour définir explicitement le serveur proxy à utiliser, lorsque la http_proxyvariable d'environnement n'est pas définie, par défaut sur protocole httpet port 1080 ( manuel ).

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

    désactiver explicitement la mise en cache , en particulier lorsqu’il est utilisé dans un travail cron et / ou derrière un serveur proxy.

Autre forme testée avec RHEL 6 qui utilise l’option '-u' pour dater au lieu d’ajouter le «Z» à la sortie:

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

BTW, google.comest préférable à www.google.com, car le premier entraîne une 301réponse de redirection, qui est beaucoup plus petite ( 569vs 20k+caractères), mais toujours bon à utiliser.

Ryenus
la source
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
Ryenus
^ ci-dessus est la wgetversion, bien que je préfère personnellement l’utiliser curl.
Ryenus
2
Passer des données non normalisées d’Internet en tant que variable à une invocation sudo? Est-ce 1999?
dfc
2
Ou utilisez simplement tlsdate et ne vous fiez pas à de mauvais problèmes comme celui-ci.
dfc
oui, cela fonctionne avec les mandataires. J'ai lu la question aussi.
dfc
5

S'il s'agit uniquement d'un proxy HTTP, le port 80 est utilisé. La réponse de base est donc non à cette question. NTP utilise le port UDP 123. S'il s'agit d'un serveur proxy plus générique, desservant tous les ports, alors peut-être.

Certains programmes utilisent NTP sur HTTP. Je n'utilise pas Linux, mais celui-ci pourrait le faire:

http://www.rkeene.org/oss/htp/ (toujours pas sûr si cela fera l'authentification non plus).

Je ne pouvais pas en trouver un pour Windows, mais je le posterais si je le faisais.

KCotreau
la source
Encore une fois pour Linux, je ne peux donc rien ajouter de plus qu'un lien: mina86.com/2010/01/16/ntp-over-http Il pourrait aussi y avoir quelque chose qu'une de ces publications publie: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau
Le lien NTP sur HTTP est inspirant, merci pour cela!
Ton van den Heuvel
5

Une solution rapide et sale pour les personnes derrière un serveur proxy http:

Mon emplacement est GMT + 4, je peux consulter l’heure actuelle sur le serveur timeapi à l’ adresse http://www.timeapi.org/utc/in+four+hours . Pour plus d’informations , veuillez consulter le site Web correspondant à votre emplacement.

Pour configurer la date et l'heure, je fais:

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

Vous pouvez répéter la commande si la commande initiale "time" indique une valeur élevée ...

Mehdi Amiri
la source
Merci pour le conseil, je l'ai encore plus facile: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"vous n'avez pas besoin de faire attention au fuseau horaire si votre système d'exploitation est configuré correctement. Linux reconnaît le fuseau horaire fourni dans la chaîne et définit l'heure du système de manière appropriée.
Melebius
2

Le service NTP utilise le protocole UDP pour synchroniser l'heure. Donc, le proxy HTTP / TCP peut ne pas fonctionner pour cela. Alternative à la réponse acceptée, il existe un bon outil htpdate pour synchroniser le temps derrière le proxy.

Un exemple de travail cron:

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

Bien que ntp over http ait été mentionné, je suis surpris que personne ne mentionne le petit utilitaire astucieux htpdatedisponible sur http://www.vervest.org/htp/ . Contrairement aux alternatives, htpdatefait partie des dépôts par défaut de Debian et Ubuntu et peut être installé avec apt-get.

Il peut être exécuté en tant que commande ordinaire ou en mode démon en mode silencieux.

non déterministe
la source
Vérifiez ma réponse ci-dessus.
artificerpi
1

En supposant que la http_proxyvariable d'environnement est définie:

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

Ou utiliser curl -I --proxy="..." "http://www.google.com/"

Après tout, si le temps imparti au site de Google n’est pas défini, il n’ya plus d’espoir.

Carveone
la source
1

Étendre sur https://superuser.com/a/509620/362156

Supposons que vous êtes à Berlin (Allemagne).

Alors utilisez ceci:

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
la source
Vous devriez expliquer ce qui est différent dans votre solution par rapport à la réponse de fiford_g.
pabouk
0

Pour une implémentation déjà prête à l'emploi de l'excellente réponse de @ryenus, consultez set_system_clock_from_google.sh .

Jay Taylor
la source