Как настроить / etc / Issues, чтобы показать IP-адрес для eth0

12

У меня есть пара виртуальных машин linux с мостовыми интерфейсами, и я хотел бы, чтобы IP-адрес машины отображался после загрузки машины (при входе в систему, где обычно указывается релиз и ядро).

Из того, что я могу сказать, сообщение взято из / etc / Issues, но я не уверен, как и когда писать в него.

Бруно Лопес
источник
Эй, Бруно, можешь ли ты изменить принятый ответ на PabloC? Его ответ действительно великолепен. Найти документацию для этого очень сложно, и его ответ очень полный.
Питер Сенна

Ответы:

13

Это просто текстовый файл ... вы пишете в него так же, как отправляете текст в файл любым другим сценарием оболочки. Что-то вроде этого заменит / etc / issue только вашим IP-адресом:

ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -f2 -d: > /etc/issue

Очевидно, вы можете сделать это произвольно более сложным, в зависимости от того, какую информацию вы хотите в вашем /etc/issueфайле.

Вы можете записать в этот файл ваш локальный эквивалент /etc/rc.d/rc.local (который обычно выполняется после всех других сценариев запуска).

larsks
источник
5
Чуть более линукс сказатьip address show eth0 | awk '/inet / {print $2}' | cut -d/ -f1
Сорпигал
Я не уверен, как это больше Linux, но да, это тоже работает.
Жаворонки
1
@larks: Это больше Linux, потому что Linux ip- это инструмент, который вы должны использовать для такого рода вещей. ifconfigтехнически только для совместимости.
Сорпигал
33

В CentOS 7 и Debian 8 (и, возможно, в других) просто добавьте следующую строку в/etc/issue

My IP address: \4

и это приведет к IPv4-адресу компьютера. Если у вас есть несколько сетевых интерфейсов, и вы хотите выбрать один конкретный, вы можете указать его с помощью

My IP address: \4{eth0}

Проверьте man gettyсписок поддерживаемых escape-последовательностей в вашем дистрибутиве.

PaoloC
источник
Также работает на CentOS 8 :)
Орсирис де Йонг
Это отлично работало на моем Centos 7 vm.
Кевин Мейсон
6

Этот скрипт будет добавлять / удалять 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Недостатком его размещения является то, что он выполняется только один раз во время загрузки.

powpow
источник
3
Для тех, кто ищет, в Red Hat / CentOS / etc этот скрипт будет /sbin/if{up,down}-local. (Если он существует, он называется /etc/sysconfig/network-scripts/ip{up,down}-post.)
Аарон Копли
@powpow: почему «Локальные IP-адреса»? --all-ip-addressesвыводит также «публичные» IP-адреса. Может быть, что-то вроде «IP-адреса всех внешних интерфейсов этого хоста:» имеет больше смысла.
Ypid
4

Вы можете написать это один раз. к сожалению, нет escape-последовательности getty для отображения ip-адреса eth0, но есть escape-последовательность, которую вы можете использовать в / etc / issue для отображения имени хоста: \ n

вы всегда можете статически установить ip машины в / etc / issue, записав его прямо в файл. имейте в виду, что файл /etc/issue.net используется для удаленных входов в систему, так что вы можете также отредактировать его.

в любом случае, после работы в окне терминала вы потеряете начальный экран и информацию об адресе ip / host вместе с ним. лучший способ - установить имя хоста в командной строке (большинство дистрибутивов Linux), используя \ h или \ H, или снова, статически устанавливая IP-адрес, который вы знаете, установлен на хосте в переменной PS1, которую вы можете установить для переменной PS1 в / etc / профиль на большинстве дистрибутивов Linux.

user237419
источник
1
Это просто для того, чтобы узнать, к какому IP подключаться после загрузки виртуальной машины, так что достаточно настроить его, как говорит жаворонок :)
Bruno Lopes
1

Большое спасибо @larsks за начало работы. Я обнаружил, что у меня были проблемы с завершением сценария, прежде чем он был необходим, поэтому мой файл с вопросом всегда был пустым. Поэтому я добавил паузу в 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/.

nomadic_squirrel
источник
1

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

h0tw1r3
источник
0

Для любого приземляющегося здесь, который использует 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

Прекрасно работает!

Стив Макдональд
источник