Resumo:
Dado que temos hexip=$(gethostip -x google.com)
, podemos "usar o shell" para obter o endereço decimal quádruplo:
$ gethostip -d "$((0x$hexip))"
216.58.205.46
E então, use getent para obter o nome:
$ getent hosts "$(gethostip -d "$((0x$hexip))")"
216.58.205.46 mil04s24-in-f14.1e100.net
Nenhuma ferramenta adicional para instalar.
As funções para conversões numéricas de shell são fornecidas abaixo.
Descrição.
Como você tem gethostip
instalado, ele também pode fornecer um endereço quádruplo decimal:
$ gethostip -d google.com.
172.217.0.174
E (não documentado) que também pode entender números de 32 bits decimais :
$ gethostip -d 100
0.0.0.100
$ gethostip -d 3627732270
216.58.205.46
Também surpreendentemente, não valores hexadecimais, ele faz como saída, mas não como entrada.
Portanto, o único problema é: converter um valor hexadecimal em um valor decimal.
Com o shell:
$ echo "$((0x$hexip))"
3627732270
Então, em uma linha:
$ gethostip -d "$((0x$hexip))"
216.58.205.46
E para converter de um IP (endereço) para um PTR (nome):
$ getent hosts "$(gethostip -d "$((0x$hexip))")"
216.58.205.46 mil04s24-in-f14.1e100.net
Se você quiser fazer conversões diretamente no shell (supondo que ele permite funções), poderíamos definir essas funções:
# Return decimal integer representation from a dotted-decimal.
iptoint () { local IFS=.; qtoint $1; }
# Returns an hex from a dotted-decimal IP (x.x.x.x)
iptohex () { local IFS=.; qtohex $1; }
# Returns dotted-decimal from a 32 bit (decimal) integer value.
inttoip () { echo "$(($1>>24)).$((($1>>16)&255)).$((($1>>8)&255)).$(($1&255))"; }
# Return 32 bit (hex) value, given the decimal integer value.
inttohex () { printf '%X' "$1"; }
# Return dotted-decimal IP address from a 32 bit (hex) integer value.
hextoip () { inttoip "$((0x$1))"; }
# Return decimal integer representation from the 32 bit (hex) value.
hextoint () { echo "$((0x$1))"; }
# Return dotted-decimal IP address from four decimal values.
qtoip () { (($#<4))&&return 4; inttoip "$(qtoint "$@")"; }
# Return decimal integer value from four decimal values.
qtoint () { (($#<4))&&return 4; echo "$(( ((($1)<<8|$2)<<8|$3)<<8|$4 ))"; }
# Return hex integer value from four decimal values.
qtohex () { (($#<4))&&return 4; printf '%X\n' "$(qtoint "$@")"; }
E todas essas conversões funcionarão:
site=google.com.
hexip=$(gethostip -x $site) || exit 4
echo "hex = $hexip"
integer=$(hextoint "$hexip"); echo "integer = $integer"
quadIP=$( hextoip "$hexip"); echo "quadIP = $quadIP"
printf 'quad IP ==> integer %16s ==> %-16s\n' "$quadIP" "$( iptoint "$quadIP" )"
printf 'quad IP ==> hex %16s ==> %-16s\n' "$quadIP" "$( iptohex "$quadIP" )"
printf 'integer ==> quad IP %16s ==> %-16s\n' "$integer" "$( inttoip "$integer" )"
printf 'integer ==> hex %16s ==> %-16s\n' "$integer" "$( inttohex "$integer" )"
printf 'hex ==> quad IP %16s ==> %-16s\n' "$hexip" "$( hextoip "$hexip" )"
printf 'hex ==> integer %16s ==> %-16s\n' "$hexip" "$( hextoint "$hexip" )"
set -f; IFS=. eval 'set -- $quadIP'
printf 'quad ==> quad IP %16s ==> %-16s\n' "$*" "$( qtoip "$@" )"
printf 'quad ==> integer %16s ==> %-16s\n' "$*" "$( qtoint "$@" )"
printf 'quad ==> hex %16s ==> %-16s\n' "$*" "$( qtohex "$@" )"
Resultados em:
hex = D83ACD2E
integer = 3627732270
quadIP = 216.58.205.46
quad IP ==> integer 216.58.205.46 ==> 3627732270
quad IP ==> hex 216.58.205.46 ==> D83ACD2E
integer ==> quad IP 3627732270 ==> 216.58.205.46
integer ==> hex 3627732270 ==> D83ACD2E
hex ==> quad IP D83ACD2E ==> 216.58.205.46
hex ==> integer D83ACD2E ==> 3627732270
quad ==> quad IP 216 58 205 46 ==> 216.58.205.46
quad ==> integer 216 58 205 46 ==> 3627732270
quad ==> hex 216 58 205 46 ==> D83ACD2E