How can I display my machine's IP address on a TTY login screen?

The server I administrate has a dynamic IP address assigned by DHCP, which is inconvenient. When I want to SSH into it, I have to first log in by hand and use ifconfig to find its current IP address. Thankfully, it lives about two feet from where I sit.

I know how to edit /etc/issue to show different values before the login prompt is delivered to the display, but I'd like to know if it's possible for /etc/issue to display the current IP address of eth0 (re-evaluated at boot time) so that I can see it and then ssh in without having to log in to run ifconfig.


Solution 1:

As of Debian 8/jessie you can use the \4 and \6 escape characters to output the IPv4 and IPv6 addresses. So the /etc/issue file:

Debian GNU/Linux 8 \n \l

eth0: \4{eth0}

Would output something like the following at the login console:

Debian GNU/Linux 8 myserver tty1

eth0: 192.168.1.100
myserver login:

I imagine Ubuntu would provide similar functionality (at least in newer releases)

Solution 2:

/etc/issue is unfortunately a plain text, it has some options you can add to it (see man agetty) but not the IP address of eth0.

If you put this in /etc/rc.local:

IP=$(/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')
echo "eth0 IP: $IP" > /etc/issue

Then you will see something like this:

eth0: 192.168.0.2
myServer login:

Solution 3:

Building on Alex's answer and Rebs' comment, this is what I have for my /etc/rc.local file (only relevant lines):

PRE_MSG="Ubuntu 14.04.3 LTS" # this is from the original /etc/issue

IP=$(/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')

IP_MSG="Server IP Address:"

printf "%s %s %s\n\n%s %s\n\n" "$PRE_MSG" '\n' '\l' "$IP_MSG" "$IP" > "/etc/issue"

The printf command does the magic. Unfortunately putting the '\n' and '\l' inside the format string ended up replacing the first one with the new line character and the /etc/issue file was messed up.

So long story short, these 4 lines keep the original info displayed by /etc/issue file and add the Server IP Address: message.

And as Rebs' said, keep in mind that every time you reboot the server, this script will override the /etc/issue file, so maybe try it inside a different script and on a different file and once it's working, transfer the changes over...

Good luck and happy BASHing :)

Solution 4:

With systemd you can do systemctl edit getty@ with something like:

[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'

Then systemctl daemon-reload && systemctl restart getty@tty1

Solution 5:

For Ubuntu 19.04, I followed these steps:

I created the file: /etc/network/if-up.d/update-issue with the following contents:

#!/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

I then marked the file as executable: chmod 0755 /etc/network/if-up.d/update-issue

Works great!