Тест [[-t 1]]
возвращает истину, если дескриптор файла 1 (STDOUT) открыт на терминале, в противном случае - ложь .
Из help test
в bash
:
-t FD True if FD is opened on a terminal.
Вы можете использовать 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
Учитывая, что у нас есть 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