Как использовать оболочку для получения адреса IPv6 из MAC-адреса?

Машины Linux используются в качестве DCSes, но невозможно дать более определенные ответы, не зная строгих требований. И сервер - и встроено ориентированные дистрибутивы могли бы быть соответствующими.

11
06.08.2014, 08:28
5 ответов

Если вы хотите создать целый IPv6-адрес из MAC (и заданного префикса), вы можете воспользоваться отличным инструментом ipv6calc Питера Берингера.

Следующая команда создаёт link-local IPv6 адрес (fe80:: префикс) из MAC адреса:

$ ipv6calc --action prefixmac2ipv6 --in prefix+mac --out ipv6addr fe80:: 00:21:5b:f7:25:1b
fe80::221:5bff:fef7:251b

Вы можете оставить большинство опций и дать команде угадать, что делать:

$ ipv6calc --in prefix+mac fe80:: 00:21:5b:f7:25:1b
No action type specified, try autodetection...found type: prefixmac2ipv6
fe80::221:5bff:fef7:251b

Для дистрибутивов Debian, ipv6calc находится в главном репозитории.

10
27.01.2020, 19:58

Функция fork () предназначена не только для копирования процесса-отца, она возвращает значение, которое указывает на то, что процесс является процессом-отцом или процессом-сыном, на рисунке ниже показано, как можно использовать fork () в качестве отца и сына:

enter image description here

, как показано, когда процесс является форком () возвращает идентификатор процесса сына PID , иначе он возвращает 0

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

ТАК, ни одна копия процесса не является точной вещью как вилка ().

-121--3868-

При первом нет tty для ssh , так как stdin не подключен к терминалу, это файл. На самом деле, если я попытаюсь выполнить аналогичную команду (на Debian), я получу следующую ошибку:

Псевдотерминал не будет выделен, потому что stdin не является терминалом.

Чтобы получить его на работу вы можете сделать что-то вроде:

ssh -tt 192.168.1.100 <<EOF
sudo -S id
password
EOF

Хотя это не очень хорошая идея, так как пароль будет в виде обычного текста.

Обновление

Я наткнулся на простое решение, которое позволяет избежать кодирования пароля в виде обычного текста, вы можете использовать графическую программу для ввода пароля:

ssh -X 192.168.1.100 <<EOF
SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A id
EOF

Конечно, программа ssh-askpass должна быть установлена в данном месте, и вы должны запустить сеанс X на компьютере, на котором вы работаете. Существует несколько вариантов программы ssh-askpass , которая также должна работать (версии Gnome/KDE). Кроме того, работа также должна выполняться графической программой sudo замены, такой как gksu или kdesudo .

-121--91046-

Из записи IPv6 Википедия более текстовое описание:

64-битный идентификатор интерфейса чаще всего выводится из его 48-битного MAC-адреса.

MAC-адрес 00: 0C: 29: 0C: 47: D5 преобразуется в 64-разрядный EUI-64 путем вставки FF: FE в середине: 00: 0C: 29: FF: FE: 0C: 47: D5.

Поэтому замена третьего : на : FF: FE: должна делать хитрость:

echo  00:0C:29:0C:47:D5 | sed s/:/:FF:FE:/3
00:0C:29:FF:FE:0C:47:D5

Нет понятия, если этот синтаксис специфичен для GNU sed.


Выполняемая работа:

Преобразование в биты:

for HEX in $(tr ":" " " <<< 00:0C:29:FF:FE:0C:47:D5) 
  do 
    printf "%08d " $(bc <<< "ibase=16;obase=2;$HEX") 
  done

должно привести к тому, что биты 00000000 00001100 00101001 11111111 11111110 00001100 01000111 11010101 оставят только переворачивание номера бита 7.

4
27.01.2020, 19:58
#! /usr/bin/env python
import sys
n=[int(x, 16) for x in sys.argv[1].split(":")]
print "fe80::%02x%02x:%02xff:fe%02x:%02x%02x" % tuple([n[0]^2]+n[1:])
3
27.01.2020, 19:58

Вы можете создать функцию bash(и поместить ее в свой ~/.bashrc), которая использует IFSдля разделения MAC-адреса на 6 групп, разделенных двоеточием -, и собирает их. Вам также нужно перевернуть 7-й старший бит, то есть бит 1 первого байта:

mac_to_ipv6_ll() {
    IFS=':'; set $1; unset IFS
    echo "fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}

Пример использования:

$ mac_to_ipv6_ll 12:34:56:78:90:12
fe80::1034:56ff:fe78:9012
0
27.01.2020, 19:58

Я должен отдать должное @rubo77 выше за чистую -оболочку (, если не учитывать ответ printf )выше, который я искал.

Это добавляет немного sed к:

(a )исключить любые начальные нули в каждом 16 -битном фрагменте; и

(b )исключить все дальнейшие -нулевые фрагменты в начале IID

...согласно общепринятым правилам краткости адресов.

mac_to_eui64() {
 IFS=':'; set $1; unset IFS
 echo "fe80::$(printf %x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" |
  sed -E 's/:0+/:/g; s/:{3,}/::/; s/:$/:0/'
}

Обратите внимание, что если вы хотите переназначить это для других (произвольных )префиксов, что вы можете сделать, поскольку EUI -64 можно использовать в любой области (, хотя рекомендуется не использовать его для глобальных адресов. из соображений конфиденциальности )вам понадобится немного более запутанный скрипт sed. Это связано с тем, что префикс fe80::уже содержит три нулевых фрагмента -(, опущенных до двойного двоеточия -), примыкающего к началу IID. Таким образом, даже если первый фрагмент IID состоит из -нулей (, то есть если MAC начинается с 02:00), он также будет исключен. Формат EUI -64 оставляет только один дополнительный фрагмент, который может быть полностью -нулевым --последним --, который скрипт выше добавляет обратно как один ноль. Для других префиксов может потребоваться оставить один ноль между двумя двоеточиями.

0
27.01.2020, 19:58

Теги

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