Как настроить /etc/issue для отображения IP-адреса для eth0

Вопрос или проблема

У меня есть несколько виртуальных машин 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.

Примеры

  1. Использование 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.

  2. Обновление через 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.

  3. Использование 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-адрес машины без дополнительных команд, улучшая качество обслуживания и использования виртуальных машин в современных сетевых средах.

Оцените материал
Добавить комментарий

Капча загружается...