Как считать IP-адрес назад?

Из того, что я читал, IBM Thinkpad 240 не поддерживает начальную загрузку ни от какого устройства кроме внутреннего жесткого диска или дискеты. Так как дисковод для гибких дисков потерян, и я сомневаюсь, что Вы хотите найти и купить один, Вы застреваете с одной опцией: Удалите жесткий диск и подключите его к другому компьютеру и выполните установку ОС оттуда. Довольно хитрый.

19
27.07.2014, 06:39
18 ответов
[1189206]Вы можете сделать это с помощью [1189632]AWK[1189633]. Есть и более приятные способы сделать это, но, думаю, это самый простой.

Это изменит порядок IP-адресов.

Просто чтобы сохранить несколько нажатий клавиш, как предложил Микель, мы можем еще раз сократить верхнее утверждение:

OR

OR

AWK довольно гибкий. :)[1189217].

29
27.01.2020, 19:44
[1189292] С помощью [1189720]zsh[1189721]:[12157] Это флаги переменного расширения:[12158]s:[1189863]: [1189864]s[1189865]plit на [1189866]. [12159]Oa[1189869]: обратный [1189870]o[1189871]rder [1189872]a[1189873]rray[12160]j:...[1189875]: [1189876]j[1189877]oin на [1189878].[12161]
3
27.01.2020, 19:44
[12125] Таким образом, вы можете ввести адрес и нажать кнопку return для получения результата.[1189233].
1
27.01.2020, 19:44
[1189286] С помощью GNU [1189716] sed[1189717],[12154] меняет любой формат адресов IPv4.[12155] Пример:[12156]
5
27.01.2020, 19:44
[1189220] Если вы хотите использовать только оболочку ([1189634]zsh[1189635], [1189636]ksh93[1189637], [1189638]bash[1189639]), вот другой способ:

Или в обычном старом оболочке:

17
27.01.2020, 19:44
[1189218] Легко с Перлом, таким образом:

12
27.01.2020, 19:44

CPU3 CPU2 CPU1 CPU0  Bin  Hex
---- ---- ---- ----  ---  ---
OFF  OFF  OFF  ON  = 0001 = 1
OFF  OFF  ON   OFF = 0010 = 2
OFF  OFF  ON   ON  = 0011 = 3
OFF  ON   OFF  OFF = 0100 = 4
OFF  ON   OFF  ON  = 0101 = 5 
OFF  ON   ON   OFF = 0110 = 6
OFF  ON   ON   ON  = 0111 = 7
ON   OFF  OFF  OFF = 1000 = 8
ON   OFF  OFF  ON  = 1001 = 9
ON   OFF  ON   OFF = 1010 = A 
ON   OFF  ON   ON  = 1011 = B
ON   ON   OFF  OFF = 1100 = C
ON   ON   OFF  ON  = 1101 = D
ON   ON   ON   OFF = 1110 = E 
ON   ON   ON   ON  = 1111 = F 
Просто для любопытства...[1189653] с помощью [1189654] так[1189655] из GNU coreutils: дана переменная [1189656]ip[1189657] в виде [1189658]192. 168.1.1 [1189659] затем [12123], т.е. [12124]
33
27.01.2020, 19:44

Чтобы завершить его, Ruby:

ruby -r ipaddr -e 'puts IPAddr.new(ARGV.first).reverse' 192.168.1.1

Который также поддерживает IPv6

2607:F8B0:4000:080A:0000:0000:0000:2000
=> 0.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.a.0.8.0.0.0.0.4.0.b.8.f.7.0.6.2.ip6.arpa
6
27.01.2020, 19:44

В Python

 a = "192.168.1.122"
 import re
 m = re.search(r'(\d+)\.(\d+)\.(\d+)\.(\d+)',a)
 ip = m.group(4),m.group(3),m.group(2),m.group(1)
 '.'.join(ip) + ".in-addr.arpa"
 '122.1.168.192.in-addr.arpa'
2
27.01.2020, 19:44
IFS=. ; set -- ${0+192.168.1.2}
printf %b. $4 $3 $2 $1 in-addr.arpa\\c

IFS=. ; printf %s\\n \
    in-addr.arpa ${0+192.168.1.2} |    
sed '1!G;$s/\n/./gp;h;d'

IFS=. ; printf '[%b.] ' \
    ${0+192.168.1.2.]PPPPP\\c} |dc
echo in-addr.arpa
2
27.01.2020, 19:44

Использование стандартной библиотеки Python :

>>> ipaddress.ip_address('192.168.1.1').reverse_pointer
'1.1.168.192.in-addr.arpa'
4
27.01.2020, 19:44

Другая возможность - использовать инструмент командной строки "dig" с переключателем "-x".

На самом деле он выполняет запрос к записи PTR, но если вы отфильтруете «PTR», он покажет вам одну прокомментированную строку (запрос) и, возможно, несколько ответов.

Использование «dig» может быть удобно для быстрого написания имени PTR без написания небольшого скрипта. В частности, если вам это нужно в интерактивном режиме (чтобы вырезать и вставить результат). Он также работает с IPv6.

3
27.01.2020, 19:44

С host командой из dnsutils:

$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.
1
27.01.2020, 19:44

Если вы хотите, чтобы он работал и с IPv6, вы можете использовать dig -x.

Например:

$ dig -x 194.68.208.240 | egrep '^;.*PTR$' | cut -c 2- | awk '{print $1}'
240.208.68.194.in-addr.arpa.

$ dig -x 2001:db8:dc61:2a61::1 | egrep '^;.*PTR$' | cut -c 2- | awk '{print $1}'
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.6.a.2.1.6.c.d.8.b.d.0.1.0.0.2.ip6.arpa.
2
27.01.2020, 19:44

Una alternativa más corta a la respuesta de mattbianco con menos herramientas, pero usando pcregrep podría ser:

$ dig -x 194.68.208.240 | pcregrep -o1 '^;(\S+)\s+IN\s+PTR$'
240.208.68.194.in-addr.arpa.

$ dig -x 2001:db8:dc61:2a61::1 | pcregrep -o1 '^;(\S+)\s+IN\s+PTR$'
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.6.a.2.1.6.c.d.8.b.d.0.1.0.0.2.ip6.arpa.
0
27.01.2020, 19:44

Предположим, что var содержит ip:ip=192.168.2.1. Если значение необходимо присвоить новой переменной, просто заключите любое решение в $()и назначьте его переменной rr=$(...).

Возможны некоторые решения:

Простейший: printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Большинство снарядов: IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
Некоторые снаряды: IFS=. read d c b a <<<"$ip"; printf %s "$a.$b.$c.$d.in-addr.arpa."
: echo "$ip" | awk -F. '{OFS=FS;print $4,$3,$2,$1,"in-addr.arpa"}'
: echo "$ip" | sed -E 's/([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)$/\4.\3.\2.\1.in-addr.arpa./'
: echo "arpa.in-addr.$ip" | sed 'y/./\n/' | sed 'G;$s/\n/./gp;h;d'
: echo "$ip" | perl -F\\. -lane '$,=".";print( join(".",(reverse @F),"in-addr.arpa"))'
: dig -x "$ip" | awk -F '[; \t]+' '/^;.*PTR$/{print($2)}'
: host -t ptr 192.168.2.1 | cut -d' ' -f2

Оба решения — dig и host — работают с IPv6.

1
27.01.2020, 19:44
#!/bin/bash
# script file name reverseip.sh
if [ -z $1 ] || [ "help" == $1 ]
then
echo 'Convert a full ipv4 or ipv6 address to arpa notation'
echo "usage:"
echo./reverseip.sh "help"
echo./reverseip.sh "ipv4 address format: xxxx.xxxx.xxxx.xxxx"
echo./reverseip.sh "ipv6 address format: xxxx:xxxx:xxxx:xxxx::xxxx"
echo "examples:"
echo./reverseip.sh 216.58.207.35
echo./reverseip.sh 2a00:1450:4001:824::2003
exit
fi

# if ip address passed containing ':'
if [[ $1 = *':'* ]];
then
# invert ipv6 address e.g.: 2a00:1450:4001:824::2003 to 3.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.4.2.8.0.1.0.0.4.0.5.4.1.0.0.a.2.
# @see lsowen https://gist.github.com/lsowen/4447d916fd19cbb7fce4
echo "$1" | awk -F: 'BEGIN {OFS=""; }{addCount = 9 - NF; for(i=1; i<=NF;i++){if(length($i) == 0){ for(j=1;j<=addCount;j++){$i = ($i "0000");} } else { $i = substr(("0000" $i), length($i)+5-4);}}; print}' | rev | sed -e "s/./&./g" | echo "$(</dev/stdin)ip6.arpa."
else
# invert ipv6 address e.g.: 216.58.207.35 to 35.207.58.216.in-addr.arpa
# @see Stéphane Chazelas https://unix.stackexchange.com/questions/132779/how-to-read-an-ip-address-backwards
echo $(printf %s "$1." | tac -s.)in-addr.arpa
fi
1
27.01.2020, 19:44

Использовать следующую однострочную оболочку:

echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -
0
27.01.2020, 19:44

Теги

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