Машины Linux используются в качестве DCSes, но невозможно дать более определенные ответы, не зная строгих требований. И сервер - и встроено ориентированные дистрибутивы могли бы быть соответствующими.
Если вы хотите создать целый 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
находится в главном репозитории.
Функция fork () предназначена не только для копирования процесса-отца, она возвращает значение, которое указывает на то, что процесс является процессом-отцом или процессом-сыном, на рисунке ниже показано, как можно использовать fork () в качестве отца и сына:
, как показано, когда процесс является форком () возвращает идентификатор процесса сына 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
.
Из записи 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.
#! /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:])
Вы можете создать функцию 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
Я должен отдать должное @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 оставляет только один дополнительный фрагмент, который может быть полностью -нулевым --последним --, который скрипт выше добавляет обратно как один ноль. Для других префиксов может потребоваться оставить один ноль между двумя двоеточиями.