Это довольно легко сделать одним paste
вызовом
<main paste -d '\0\n' - rename -
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky
Когда в списке разделителей, переданном в -d
, paste
используется несколько разделителей, последовательно используются эти разделители до тех пор, пока они не будут исчерпаны, а затем начинается с них снова. В приведенной выше команде переданы два разделителя:\0
(пустая строка )и\n
(новая строка ). Стандартный ввод указывает на файл main
, который затем дважды упоминается внутри команды через два -
,все это ведет к строке вывода, формируемой
main
и rename
и добавить ее к приведенной выше main
И так далее
В RHEL 8 dhcpd.service
использует переменную $DHCPDARGS
в командной строке ExecStart=
:
# /usr/lib/systemd/system/dhcpd.service
[Unit]
Description=DHCPv4 Server Daemon
Documentation=man:dhcpd(8) man:dhcpd.conf(5)
Wants=network-online.target
After=network-online.target
After=time-sync.target
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/dhcpd
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS
StandardError=null
[Install]
WantedBy=multi-user.target
Но в файле окружения /etc/sysconfig/dhcpd
, где должна быть определена такая переменная, есть предупреждение о том, что этот файл больше не используется:
cat /etc/sysconfig/dhcpd
# WARNING: This file is NOT used anymore.
# If you are here to restrict what interfaces should dhcpd listen on,
# be aware that dhcpd listens *only* on interfaces for which it finds subnet
# declaration in dhcpd.conf. It means that explicitly enumerating interfaces
# also on command line should not be required in most cases.
# If you still insist on adding some command line options,
# copy dhcpd.service from /lib/systemd/system to /etc/systemd/system and modify
# it there.
# https://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F
# example:
# $ cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
# $ vi /etc/systemd/system/dhcpd.service
# $ ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>
# $ systemctl --system daemon-reload
# $ systemctl restart dhcpd.service
Таким образом, очевидно, что ISC dhcpd RHEL 8 был исправлен, чтобы выбирать интерфейсы для прослушивания на основе того, содержит ли его файл конфигурации объявления подсети для интерфейса или нет. Если для определенного интерфейса нет объявления подсети, он не должен отвечать для этого интерфейса.
Из-за того, как протокол DHCP работает на IPv4, dhcpd
потребуется использовать необработанный сокет (, чтобы иметь возможность получать широковещательные пакеты с адресом источника 0.0.0.0 и адресом назначения 255.255.255.255, а также для отправить на 255.255.255.255 без ограничений обычной маршрутизацией IPv4 ),и поэтому ему в любом случае нужно более тщательно обрабатывать входящие пакеты.
Поскольку dhcpd
использует необработанные сокеты, на него также не влияют брандмауэры iptables
.
Если вы по-прежнему хотите добавить имена интерфейсов в командную строку, вы можете cp /lib/systemd/system/dhcpd.service /etc/systemd/system/
и затем изменить версию в /etc/systemd/system
или просто использовать systemctl edit dhcpd.service
для создания файла переопределения. Конечно, вам нужно помнить, что служебные файлы могут иметь несколько строк ExecStart=
, поэтому, чтобы переопределить существующую строку, а не просто добавить другую, вы должны запустить systemctl edit dhcpd.service
и ввести три строки:
[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>
Первая пустая строка ExecStart=
сообщает systemd, что вы хотите переопределить существующее определение ExecStart
в сервисном файле, а не добавлять второе.
Если вы используете стратегию cp /lib/systemd/system/dhcpd.service /etc/systemd/system/
, не забудьте запустить systemctl daemon-reload
после изменения файла /etc/systemd/system/dhcpd.service
.
Если вы используете systemctl edit dhcpd.service
, он автоматически запустит эквивалент systemctl daemon-reload
.