我尝试通过取消注释来安装xinetd
和允许某些服务,例如echo
, time
,daytime
/etc/inetd.conf
我用 nc 测试过:
$ nc localhost echo #works like cat—✓
$ nc localhost daytime #works like date—✓
但后来我尝试了:
$ nc localhost time
# => weird characters
好的,显然,时间给出了二进制时间戳。
所以我想我可以通过将其转换为数字并将其输入到来破译它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/^ */@/')
太酷了,现在我得到了人类可读的准确时间,只不过这一天是 70 年后的今天。
怎么了? (openbds-inetd
给出相同的结果)。
答案1
时间协议(RFC 868)是很不寻常的,更不用说过时了。
时间以二进制编码,但最重要的是,纪元是 1900-01-01 00:00:00,而不是标准 UNIX 纪元 (1970-01-01 00:00:00)。
像这样解码它:
python -c 'import struct, sys; print(struct.unpack(">L", sys.stdin.read())[0]-2208988800)'
例如:
nc localhost time | python -c 'import struct, sys; print(struct.unpack(">L", sys.stdin.read())[0]-2208988800)'
或者只需多做一点工作即可将其转换为 Pythondatetime
对象:
python -c 'import struct, sys, datetime; print(datetime.datetime.utcfromtimestamp(int(struct.unpack(">L", sys.stdin.read())[0]-2208988800)))'