I quite often spin up virtual machines on which to test something on the Mac, and after VirtualBox finishes doing what it’s supposed to, I typically wish to access them via SSH but cannot easily, as I don’t know their dynamically assigned IP address or I’ve forgotten the address I assigned statically.
Linux
Sebastien showed us how to do it on Linux: the magic capabilities are already hidden within agetty(8), in the section on /etc/issue
files.
When I modify /etc/issue
to contain the IP4 line:
\S
Kernel \r on an ]\m
IP4: \4{enp0s3} \4{enp0s8}
I’m rewarded with this:
FreeBSD
On FreeBSD, the situation is a bit more involved but very flexible.
The ttys(5) file defines how getty(8) is invoked on a terminal, and passes it a terminal type (e.g. Pc
) which getty
searches for in gettytab(5).
ttyv0 "/usr/libexec/getty Pc" xterm onifexists secure
The Pc
entry is in the the termcap-like gettytab
file:
P|Pc|Pc console:\
:ht:np:sp#9600:\
:if=/etc/jp.banner:\
:iM=/etc/jp.sh:
The first three capabilities specify the terminal has real tabs (ht
), doesn’t use parity (np
), has a line speed (sp
) of 9600, and I add the if
and iM
strings to it:
if
meansgetty
should display the named file before the prompt (/etc/issue
type)iM
points to a program which can generate an initial banner message (normally fromim
but I useif
)
So, with a very crude /etc/jp.sh
consisting of:
#!/bin/sh
iface=em0
echo "********* $(date) ******* BLA" > /etc/jp.banner
/sbin/ifconfig $iface |
awk 'BEGIN { getline ; IFACE = $1; }
/inet / { print "IP4: " IFACE " " $2;}
/inet6/ { if ( $2 !~ /^fe80/ ) { print "IP6: " IFACE " " $2; } }'
we end up with a FreeBSD console showing this:
Thanks to Trix for the awk mess ;-)
OpenBSD
On OpenBSD, the configuration is similar to that on FreeBSD, but the capabilities in OpenBSD’s gettytab(5) are reduced to a minimum with simply the im
capability (initial banner message). There are a few character sequences which can be included in that (e.g. %d
for the date or %h
for the hostname), but I don’t see how to add interface data to the banner other than actually in-place editing /etc/gettytab
on boot.
Philipp suggests I do this in /etc/rc.local
:
#!/bin/sh
data=""
for iface in em0 em1; do
ip="$(ifconfig $iface | awk '/inet / { print $2 }') "
data="$data $ip"
done
sed -i.bak "/:im=/s|(%h.*(|(%h $data) (|" /etc/gettytab
Enough for now. :)