преобразовать шестнадцатеричный IP-адрес в имя хоста

Тест [[-t 1]] возвращает истину, если дескриптор файла 1 (STDOUT) открыт на терминале, в противном случае - ложь .

Из help test в bash :

-t FD          True if FD is opened on a terminal.
6
12.09.2018, 23:37
2 ответа

Вы можете использовать glibc getentздесь:

$ getent ahostsv4 0xD83ACD2E | { read ip rest && getent hosts "$ip"; }
216.58.205.46   mil04s24-in-f46.1e100.net

Другой perlподход:

$ perl -MSocket -le '($n)=gethostbyaddr(inet_aton("0xD83ACD2E"), AF_INET); print $n'
mil04s24-in-f46.1e100.net
7
27.01.2020, 20:20

Аннотация:

Учитывая, что у нас есть hexip=$(gethostip -x google.com), мы можем «использовать оболочку» для получения адреса в квадро-десятичном формате:

$ gethostip -d "$((0x$hexip))"
216.58.205.46

А затем,используйте getent, чтобы получить имя:

$ getent hosts "$(gethostip -d "$((0x$hexip))")"
216.58.205.46   mil04s24-in-f14.1e100.net

Нет дополнительных инструментов (и )для установки.

Ниже приведены функции для числового преобразования оболочки.


Описание.

Так как вы уже установили gethostip, он также может выдавать десятичный счетверенный адрес:

$ gethostip -d google.com.
172.217.0.174

И (недокументировано ), чтобы он также мог понимать десятичные 32-битные числа:

$ gethostip -d 100
0.0.0.100

$ gethostip -d 3627732270
216.58.205.46

Также удивительно, что не шестнадцатеричные значения, это работает как вывод, но не как ввод.
Таким образом, единственная проблема заключается в том, чтобы :преобразовать шестнадцатеричное значение в десятичное значение.
С оболочкой:

$ echo "$((0x$hexip))"
3627732270

Итак, одной строкой:

$ gethostip -d "$((0x$hexip))"
216.58.205.46

И для преобразования IP-адреса ()в имя PTR ():

$ getent hosts "$(gethostip -d "$((0x$hexip))")"
216.58.205.46   mil04s24-in-f14.1e100.net

Если вы хотите выполнять преобразования непосредственно в оболочке (, предполагая, что она поддерживает функции ), мы могли бы определить эти функции:

             # 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 "$@")"; }

И все эти преобразования будут работать:

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

Результаты в:

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 
0
27.01.2020, 20:20

Теги

Похожие вопросы