11th October 2016
Convert IP Address to Hexadecimal
PXE Boot is a great way to install clients over the network. They get their IP address by DHCP, which also sends them extra information - specifically, the IP address of a boot server, and the name of a file to request from the boot server.
Typically, they will be instructed to download pxelinux.0
, which will be passed to the CPU, and result in the client requesting a further file, either the BIOS UUID, or if that fails, then the client MAC address, or if that fails, then the client IP address (which it retries with ever-reducing accuracy: 192.168.1.47, then 192.168.1, then 192.168, then 192). However, it asks for these in hexidecimal format, which is a bit of a pain if you don't happen to be 100% fluent in all hex values between 0-255.
The conversion looks like this:
Decimal IP Address | 192 | 168 | 1 | 47 |
---|---|---|---|---|
Hexadecimal Filename | C0 | A8 | 01 | 2F |
So you need to provide files in the /var/lib/tftpboot/pxelinux.cfg/
directory, with names like C0A8012F
.
http://www.syslinux.org/wiki/index.php?title=PXELINUX explains the full process.
It's possible to sit down with a Hex Calculator (there are many online, mobile apps, etc), and work out each one. However, this little function will do it for you:
ip_to_hex() { printf '%02X' ${1//./ } }
The "${1//./ }
" means to transform the first (and only) argument, known as "$1
" (eg, "192.168.1.47"), and convert periods to spaces. This has the convenient side-effect of turning "192.168.1.47
" into "192 168 1 47
". This is useful, because printf
, when called as "printf '%02X' 192 168 1 47
" will take each of the four arguments, and print them as uppercase hexadecimal strings (as instructed by the '%02X'
formatting instruction).
You can use this function to convert the data in any way you like:
convert_ip_to_hex.sh#!/bin/bash ip_to_hex() { printf '%02X' ${1//./ } } [ "$#" -eq "1" ] && echo "You asked for $1 which is `ip_to_hex $1`" IP1=`ip_to_hex 192.168.1.47` echo "IP1 is $IP1, from 192.168.1.47" echo "I am about to convert 10.97.2.31 into hex:" ip_to_hex 10.97.2.31 IP_ADDRESS=172.17.3.193 echo "$IP_ADDRESS = `ip_to_hex $IP_ADDRESS`"
When you run this script, it will display this output:
$ ./convert_ip_to_hex.sh IP1 is C0A8012F, from 192.168.1.47 I am about to convert 10.97.2.31 into hex: 0A61021F 172.17.3.193 = AC1103C1
If you run it with an IP address as an argument, such as "./convert_ip_to_hex.sh 172.17.231.96
", it will display that, too:
$ ./convert_ip_to_hex.sh 172.17.231.96 You asked for 172.17.231.96 which is AC11E760 IP1 is C0A8012F, from 192.168.1.47 I am about to convert 10.97.2.31 into hex: 0A61021F 172.17.3.193 = AC1103C1
Invest in your career. Buy my Shell Scripting Tutorial today: