#1 Le 07/08/2014, à 16:02
- Efhache84
Conversion string en date/time
Bonjour à tous,
petite demande pour un script, je cherche à vérifier le délai écoulé depuis un accès ssh.
Pour ce faire, dans les logs j'ai des lignes du genre :
Aug 7 12:16:06 (none) authpriv.info dropbear[9655]: exit after auth (root): Exited normally
Aug 7 12:16:06 (none) authpriv.info dropbear[9668]: Child connection from 192.168.12.140:43894
l'information de date et heure je peux l'extraire en utilisant gre et awk, ce qui m'offre ceci :
/tmp # cat /var/log/syslog.log | grep dropbear | awk -F\( '{print $1}'
Aug 7 12:16:06
Aug 7 12:16:06
Aug 7 12:16:06
Désormais je voudrais convertir ce string en un timestamp (ou autre) qui permettrai de le comparer avec le temps courant et de savoir s'il est supérieur ou non à deux heures.
l'utilisation de date -d, n'est pas faisable car ne semble pas apprécier le formattage de la date présente dans le fichier de log.
Quelqu'un aurait-il une idée?
Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits
Hors ligne
#2 Le 07/08/2014, à 18:31
- pingouinux
Re : Conversion string en date/time
Bonjour,
Pour info, tu peux simplifier ta commande
awk -F\( '/dropbear/{print $1}' /var/log/syslog.log
Chez moi, la syntaxe de cette date fonctionne
$ date -d "Aug 7 12:16:06 "
Thu Aug 7 12:16:06 CEST 2014
Et tu peux faire ceci, pour obtenir des temps en secondes
t_log=$(date -d "Aug 7 12:16:06 " +"%s")
t_courant=$(date +"%s")
Pour voir si le temps courant dépasse de 2h le temps log, il suffit de tester
(( (t_courant- t_log) > 7200 )) && echo "Plus grand" || echo "Pas plus grand"
Dernière modification par pingouinux (Le 07/08/2014, à 18:32)
Hors ligne
#3 Le 08/08/2014, à 10:17
- Efhache84
Re : Conversion string en date/time
Merci de la réponse, mais comme dis plus haut date -d n'accepte pas ce format dans mon environnement (embarqué, pas ubuntu, précision que j'ai omise, désolé)
~ # date -d "Aug 8 08:14:00"
date: invalid date 'Aug 8 08:14:00'
Ma version de date : BusyBox v1.15.2 (2009-12-03 15:11:08 CET) multi-call binary
Mon problème est vraiment de convertir ce "Aug 8 08:14:00" en quelque chose de comparable avec les opérateurs mathématique.
Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits
Hors ligne
#4 Le 08/08/2014, à 10:32
- pingouinux
Re : Conversion string en date/time
À tout hasard :
LC_TIME=C date -d "Aug 8 08:14:00"
Quel est le résultat de
locale
Hors ligne
#5 Le 08/08/2014, à 11:25
- Efhache84
Re : Conversion string en date/time
~ # LC_TIME=C date -d "Aug 8 08:14:00"
date: invalid date 'Aug 8 08:14:00'
~ # locale
-sh: locale: not found
~ #
Je pense que l'utilisation des commandes courante ne sera pas possible, mon environnement est beaucoup trop strippé.
La seule option que j'imagine ce serait une fonction en shell/bash qui décortique la date pour en faire un format utilisable par date (??)
~ # date --help
BusyBox v1.15.2 (2009-12-03 15:11:08 CET) multi-call binary
Usage: date [OPTIONS] [+FMT] [TIME]
Display time (using +FMT), or set time
Options:
[-s] TIME Set time to TIME
-u Work in UTC (don't convert to local time)
-R Output RFC-822 compliant date string
-I[SPEC] Output ISO-8601 compliant date string
SPEC='date' (default) for date only,
'hours', 'minutes', or 'seconds' for date and
time to the indicated precision
-r FILE Display last modification time of FILE
-d TIME Display TIME, not 'now'
-D FMT Use FMT for -d TIME conversion
Recognized formats for TIME:
hh:mm[:ss]
[YYYY.]MM.DD-hh:mm[:ss]
YYYY-MM-DD hh:mm[:ss]
[[[[[YY]YY]MM]DD]hh]mm[.ss]
Mon approche serait-elle trop overkill ?
Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits
Hors ligne
#6 Le 08/08/2014, à 11:30
- credenhill
Re : Conversion string en date/time
hello
et avec awk ?
$ declare -A mois; mois=([Jan]=1 [Feb]=2 [Mar]=2 [Apr]=4 [May]=5 [Jun]=6 [Jul]=7 [Aug]=8 [Sep]=9 [Oct]=10 [Nov]=11 [Dec]=12)
$ awk -F "[: ]" '{b=" "; print mktime($1 b $2 b $3 b $4 b $5 b $6 )}' <<<"2014 ${mois[Aug]} 8 08:14:00"
1407478440
$ date -d "Aug 8 08:14:00" +%s
1407478440
Hors ligne
#7 Le 08/08/2014, à 11:39
- Efhache84
Re : Conversion string en date/time
ce sera la solution je pense... juste que (murphy n'est pas cool aujourd'hui) declare n'est pas disponnible ici... snnifff
Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits
Hors ligne
#8 Le 08/08/2014, à 12:17
- credenhill
Re : Conversion string en date/time
c'estt du bash, quel shell ?
en ksh, remplacer parf typeset
Hors ligne
#9 Le 08/08/2014, à 12:22
- Efhache84
Re : Conversion string en date/time
c'est ash
BusyBox v1.15.2 (2009-12-03 15:11:08 CET) built-in shell (ash)
mais dans le monde particulier du embedded... donc strippé... ce qui cause mes soucis malheureux
Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits
Hors ligne
#10 Le 08/08/2014, à 12:59
- credenhill
Re : Conversion string en date/time
sans tableau shell, dans awk
$ echo "2014 Aug 8 08:14:00" | awk -F "[: ]" -f f1.awk
1407478440
$ cat f1.awk
BEGIN {split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", a)}
{for(n in a)d[a[n]]=n; b=" "; print mktime($1 b d[$2] b $3 b $4 b $5 b $6 )}
Dernière modification par credenhill (Le 08/08/2014, à 13:34)
Hors ligne
#11 Le 08/08/2014, à 13:44
- Efhache84
Re : Conversion string en date/time
Je dois être un peu bête...
/minimuc # echo "2014 Aug 8 08:14:00" | awk -F "[: ]" -f f1.awk
awk: f1.awk:2: Call to undefined function
ferais-je une erreur en mettant le tout sur deux lignes ?
Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits
Hors ligne
#12 Le 08/08/2014, à 14:59
- credenhill
Re : Conversion string en date/time
il faut créer un fichier f1.awk contenant les 2 lignes BEGIN ...
ou alors il ne connait pas mktime
quel awk ? awk --version
Dernière modification par credenhill (Le 08/08/2014, à 15:01)
Hors ligne
#13 Le 08/08/2014, à 15:55
- Efhache84
Re : Conversion string en date/time
Bien entendu j'avais créé le fichier...
l'argument version n'est pas reconnu... c'est une version strippée de busybox... et effectivement mktime n'est pas connu
Aspire 5633 WLMi - Lucid Lynx 10.04 en 64 bits
Hors ligne
#14 Le 08/08/2014, à 16:16
- credenhill
Re : Conversion string en date/time
essayer
awk -W version
et en perl (ignore le fuseau horaire)
$ perl -e 'use Time::Piece; my $t=Time::Piece->strptime($ARGV[0], "%Y %b %d %T"); print $t->strftime("%s\n")' "2014 Aug 8 08:14:00"
1407482040
Dernière modification par credenhill (Le 08/08/2014, à 16:18)
Hors ligne