Вопрос или проблема
У меня есть несколько виртуальных машин Linux с мостовыми интерфейсами, и я хотел бы, чтобы IP-адрес машины отображался после загрузки машины (в строке входа, где обычно показывается версия и ядро).
Насколько я понимаю, это сообщение отображается из /etc/issues, но я не уверен, как и когда его записывать туда.
Это просто текстовый файл… вы записываете в него так же, как отправляете текст в файл в любом другом скрипте оболочки. Что-то вроде этого заменит /etc/issue только вашим IP-адресом:
ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -f2 -d: > /etc/issue
Очевидно, вы можете сделать это произвольно более сложным, в зависимости от того, какую информацию вы хотите в вашем файле /etc/issue
.
Вы можете записать в этот файл в вашем локальном эквиваленте /etc/rc.d/rc.local (который обычно выполняется после всех остальных скриптов при запуске).
На CentOS 7 и Debian 8 (и, возможно, на других тоже) просто добавьте следующую строку в /etc/issue
My IP address: \4
и это преобразуется в IPv4-адрес машины. Если у вас несколько сетевых интерфейсов и вы хотите выбрать один конкретный, вы можете указать его с помощью
My IP address: \4{eth0}
Посмотрите man getty
для списка поддерживаемых команд подстановки в вашей дистрибуции.
Этот скрипт будет добавлять/удалять IP-адреса в/из файла /etc/issue
по мере необходимости:
#!/bin/sh
PREFIX="Local IP addresses:"
IPADDRS=$(hostname -I | tr " " "\n" | grep -v "^$" | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tr "\n" " ")
perl -i -p -0777 -e "s/^$PREFIX[^\n]*\n\n//m; s/$/\n$PREFIX $IPADDRS\n/ if length('$IPADDRS')>6" /etc/issue
Если вы используете дистрибутив на основе Debian, лучше разместить скрипт в этих местах:
/etc/network/if-up.d/update-issue
/etc/network/if-post-down.d/update-issue
Таким образом, скрипты выполняются каждый раз при включении или отключении интерфейса. Помещение его в /etc/rc.d/rc.local
имеет недостаток, так как он выполняется только один раз при загрузке.
Вы можете записать это один раз. К сожалению, нет команды подстановки getty, чтобы показать IP-адрес eth0, но есть команда подстановки, которую вы можете использовать в /etc/issue, чтобы показать имя хоста: \n
Вы всегда можете статически задать IP машины в /etc/issue, записав его непосредственно в файл. Учтите, что файл /etc/issue.net используется для удаленного входа, поэтому, возможно, вы захотите отредактировать и его.
В любом случае, после работы в терминальном окне вы потеряете первоначальный экран и информацию об IP/хосте. Лучший способ заключается в установке имени хоста в приглашении (большинство дистрибутивов Linux так и делают), используя \h или \H, или, снова, статически задавая IP-адрес, который вы знаете, установлен на хосте, в переменной PS1. Вы можете установить переменную PS1 в /etc/profile на большинстве дистрибутивов Linux.
Systemd делает это относительно легко. systemctl edit getty@
с содержимым, похожим на:
[Service]
ExecStartPre=-/bin/bash -c '[ ! -f /etc/.issue.orig ] && cp /etc/issue /etc/.issue.orig; int=`ls /sys/class/net|grep enp|head -1`; sed -r "s/\\\\\\n/[\\\\\\4\{$$int\}]/" < /etc/.issue.orig > /etc/issue'
Затем systemctl daemon-reload && systemctl restart getty@tty1
Большое спасибо @larsks за старт. Я обнаружил, что у меня были проблемы с завершением скрипта до того, как это было необходимо, поэтому мой файл issue всегда был пуст. Поэтому я добавил паузу на 1 секунду и цикл. Я не специалист по скриптам bash, поэтому, если есть лучший способ сделать это, пожалуйста, дайте мне знать. Я добавил COUNT
, чтобы удостовериться, что он не зацикливается бесконечно.
#!/bin/sh
COUNT=1
while [ $COUNT -lt 10 ]
do
echo $COUNT
COUNT=$((COUNT + 1))
IP=`ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -f2 -d: `
if [ -n "$IP" ]; then
break
fi
sleep 1
done
echo "IP: " $IP | cat > /etc/issue
Я разместил этот скрипт в /etc/network/if-up.d/
.
Некоторые предложения рекомендовали использовать /etc/network/if-up.d/update-issue
, но ifupdown
больше не присутствует в последних версиях Ubuntu.
Альтернативой является использование networkd-dispatcher
, например:
NETWORK_SCRIPT="/etc/networkd-dispatcher/routable.d/10-update-issue"
sudo tee "$NETWORK_SCRIPT" >/dev/null << 'EOF'
#!/bin/bash
# Вызывается networkd-dispatcher, когда интерфейс становится "маршрутизируемым" (полностью включен с IP).
# Вы можете запустить любую логику, необходимую для обновления вашего /etc/issue файла, например
# вышеуказанную, рекомендованную powpow:
PREFIX="Local IP addresses:"
IPADDRS=$(hostname -I | tr " " "\n" | grep -v "^$" | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tr "\n" " ")
perl -i -p -0777 -e "s/^$PREFIX[^\n]*\n\n//m; s/$/\n$PREFIX $IPADDRS\n/ if length('$IPADDRS')>6" /etc/issue
EOF
sudo chmod +x "$NETWORK_SCRIPT"
sudo chown root:root "$NETWORK_SCRIPT"
Это обеспечит получение наиболее актуальной информации, даже если интерфейсы меняются после первоначального запуска сети.
Для тех, кто окажется здесь и использует Ubuntu 19.04, я в итоге использовал ответ от @powpow.
Я создал файл: /etc/network/if-up.d/update-issue
с следующим содержимым:
#!/bin/sh
PREFIX="Ubuntu 19.04 - dev"
IPADDRS=$(hostname -I | tr " " "\n" | grep -v "^$" | sort -t . -k 1,1n | head -1 | tr "\n" " ")
echo "$PREFIX\n\nIP: $IPADDRS\n" > /etc/issue
Затем я сделал файл исполняемым: chmod 0755 /etc/network/if-up.d/update-issue
Работает отлично!
.
Ответ или решение
Настройка файла /etc/issue для отображения IP-адреса интерфейса eth0 на ваших виртуальных машинах выполняется с помощью различных подходов, которые могут зависеть от использованной операционной системы и ее версии. В этой статье мы рассмотрим теорию, примеры и применение для достижения указанной задачи.
Теория
Файл /etc/issue
— это текстовый файл, который отображается до экранного приглашения входа в систему Linux. В нем хранится информация, которую вы хотите увидеть перед вводом своих учетных данных. Например, это может быть информация о версии ОС или какое-либо предупреждение для пользователей.
Для динамического отображения IP-адреса интерфейса сети, такого как eth0, требуется автоматическое обновление этого файла при изменении сетевого интерфейса, например, после перезагрузки. Это достигается с помощью скриптов и некоторых особенностей управления системой, таких как systemd, networkd-dispatcher или if-up.d.
Примеры
-
Использование systemd для обновления /etc/issue
Вы можете создать скрипт, который будет выполняться до запуска службы getty и обновлять файл
/etc/issue
. Например:[Service] ExecStartPre=-/bin/bash -c '[ ! -f /etc/.issue.orig ] && cp /etc/issue /etc/.issue.orig; int=eth0; IP=$(hostname -I | awk "{print \$1}"); sed -i "s/\\\\4/\\$IP/" /etc/.issue.orig > /etc/issue'
После чего следует выполнить
systemctl daemon-reload && systemctl restart getty@tty1
. -
Обновление через if-up.d (Debian и производные)
Создайте скрипт в
/etc/network/if-up.d/update-issue
:#!/bin/sh PREFIX="IP адрес:" IPADDR=$(hostname -I | awk '{print $1}') echo -e "$PREFIX $IPADDR\n" > /etc/issue
Не забудьте сделать скрипт исполняемым:
chmod +x /etc/network/if-up.d/update-issue
. -
Использование networkd-dispatcher (например, для новых версий Ubuntu)
Создайте скрипт в
/etc/networkd-dispatcher/routable.d/10-update-issue
:#!/bin/bash PREFIX="IP адрес:" IPADDR=$(hostname -I | awk '{print $1}') echo -e "$PREFIX $IPADDR\n" > /etc/issue
Удостоверьтесь, что скрипт исполняемый:
sudo chmod +x /etc/networkd-dispatcher/routable.d/10-update-issue
Применение
Теперь, понимая вышеописанные методы, вы можете настроить автоматическое обновление файла /etc/issue
, чтобы на экране входа в систему отображался актуальный IP-адрес интерфейса eth0. В зависимости от используемой системы, выберите наиболее подходящий для вас способ. Убедитесь, что скрипт проверен и корректно работает, запустите его вручную, чтобы проверить, добавлен ли IP-адрес в файл, затем выполните настройку системы для запуска скрипта в нужные моменты (например, при поднятии интерфейса).
Процедура поможет администратору или пользователю системы при необходимости быстро узнавать IP-адрес машины без дополнительных команд, улучшая качество обслуживания и использования виртуальных машин в современных сетевых средах.