一、背景
公司项目License系统激活需要获取IP地址、LZ通过ssh服务连接宿主机执行shell脚本语言在docker容器中获取宿主机的MAC地址、磁盘序列号、CPU序列号与License绑定,达到定制化主机系统激活,中间如果报命令不存在的话,下载对应的命令即可,话不多说脚本写起
二、编写脚本
1、 获取宿主机的IP地址
注意:LZ是在宿主机的环境编写脚本获取IP地址的,如果是docker环境内想获取宿主机的IP地址可以容器里面装ssh服务,通过ssh来执行宿主机脚本,或者在宿主机上写个http服务来执行脚本,容器通过暴露的端口来调用
①首先ifconfig命令看一下插网线的网卡:可以看到我的网线对应的网卡是enp4s0,ip的内网段是11,且排在内网卡第一位(还有一个内网卡是virbr0),所以使用hostname -I命令获取IP地址时,再通过awk命令处理打印$1就好(为了模拟更清楚又要安全,以下硬件信息做了大幅修改)
[root@localhost ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 08:30:fc:42:f1:20 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0enp4s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.29 netmask 255.255.255.0 broadcast 192.168.17.255
inet6 fg30::f2c5:738a:1df1:ecb7 prefixlen 64 scopeid 0x20<link>
ether b4:9e:fs:7e:cf:80 txqueuelen 1000 (Ethernet)
RX packets 7410 bytes 693421 (677.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 588 bytes 86760 (84.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 7397 bytes 450934 (440.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7397 bytes 450934 (440.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 82:94:0f:11:e9:04 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
②vim编辑一个脚本文件,脚本内容:hostname -I|awk '{print $1}',然后使用sh getIp.sh 命令或者直接./getIp.sh 跑一下脚本查看运行结果
[root@localhost ~]# vim getIp.sh
hostname -I|awk '{print $1}'
[root@localhost ~]# sh getIp.sh
192.168.11.29
2、 在docker容器中获取宿主机的MAC地址
前面已经获取到ip地址,如果是宿主机下测试ssh服务,这里LZ将获取IP地址脚本getIp.sh的打印结果当作参数传递给获取Mac地址脚本(注意:1、sshpass -p'你的连接密码',2、这里LZ取的是docker0这个虚拟网卡对应的mac地址),然后使用sh macAddress.sh 命令或者直接./macAddress.sh 跑一下脚本查看运行结果。之后在docker中运行的话(以下这里不演示了):①修改脚本将IP地址写死,②然后通过docker cp命令将脚本移到docker容器内即可使用,返回的结果一样
[root@localhost ~]# vim macAddress.sh
ipAddress=`./getIp.sh`
sshpass -p 'your connect password' ssh -o StrictHostKeyChecking=no -p 22 root@$ipAddress ifconfig docker0 | grep "ether" | awk '{print $2}'
[root@localhost ~]# sh macAddress.sh
08:30:fc:42:f1:20
3、获取宿主机的CPU序列号(使用dmidecode命令,在docker容器中或者宿主机内都可获取到)
如果报dmidecode未知命令,则yum install dmidecode -y //docker需要下载dmidecode
4、获取宿主机的磁盘序列号 (使用fdisk命令,在docker容器中或者宿主机内都可获取到)
这里可能会报GPT支持最新处于实验阶段的警告,问题不大,警告不理会就好
[root@localhost ~]# vim identifier.sh
fdisk -l |grep "Disk identifier" |awk {'print $3'}
[root@localhost ~]# sh identifier.sh
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
1D23B337-FD71-4231-B78A-B3EFF23A6789
坚定的意志,温柔的心