Serviço de tempo - interpretando os bytes

1

Eu tentei instalar xinetd e permitir alguns serviços, como echo , time , daytime , removendo o comentário deles em /etc/inetd.conf

Eu testei com nc:

$ nc localhost echo     #works like cat—✓
$ nc localhost daytime  #works like date—✓

Mas então eu tentei:

$ nc localhost time
# => weird characters

OK, o tempo dá um timestamp binário, obviamente.

Então eu pensei em decifrá-lo convertendo-o em um número e alimentando com date -d @$number :

$ nc localhost time |wc -c #=>4 (4 bytes)
$ alias reverseBytes="perl -0777e 'print scalar reverse <>'"
$ date -d $(nc localhost time | reverseBytes | od -An -tu4|sed 's/^ */@/')

Legal, agora estou obtendo tempos precisos de leitura humana, exceto que o dia é de 70 anos no futuro.

O que há de errado? ( openbds-inetd dá os mesmos resultados).

    
por PSkocik 19.07.2015 / 17:05

1 resposta

3

O protocolo de horário ( RFC 868 ) é bastante incomum, para não mencionar o arcaico.

O tempo é codificado em binário, mas além disso, a época é 1900-01-01 00:00:00, não a época padrão do UNIX (1970-01-01 00:00:00).

Decodifique assim:

python -c 'import struct, sys; print(struct.unpack(">L", sys.stdin.read())[0]-2208988800)'

Por exemplo:

nc localhost time | python -c 'import struct, sys; print(struct.unpack(">L", sys.stdin.read())[0]-2208988800)'

Ou apenas um pouco mais de trabalho para transformá-lo em um objeto datetime do Python:

python -c 'import struct, sys, datetime; print(datetime.datetime.utcfromtimestamp(int(struct.unpack(">L", sys.stdin.read())[0]-2208988800)))'
    
por 19.07.2015 / 17:14

Tags