Linux脚本文件之修改主机名

Linux脚本文件之修改主机名

一.环境

1.本次实验的主要配置环境如下,
- 物理机:windows 10
- 虚拟机:VMware pro 12,用其分别创建了三个虚拟机,其ip地址分别为192.168.211.3192.168.211.4192.168.211.5。其中192.168.211.3这台机器的主机名已经配置为littlelawson

二.需求

现在想将192.168.211.4192.168.211.5这两台机器的主机名做一下修改,修改成server1server2

三.实现

实现修改主机名有两种方式:

  • 1.一种是单独修改 /etc/hosts文件中的内容,在其后追加[ipAddress] [hostname]。但是如果我们有很多台服务器,再使用这种方式,就会变得十分低效。所以这里采用第二种方式:
  • 2.使用shell脚本,编写修改主机名的程序,然后运行即可。不过这样的前提是,运行脚本的主机A能够远程连接到其它服务器B、C…X等。【如果想更方便的话,可以实现ssh免密登录,可以看我之前的博客了解ssh】
    这里提供如下shell脚本,并做一些解释:
#!/bin/bash
for HOST in `cat hosts`;do
OLDNAME=`ssh laowang@$HOST "hostname"`
NEWNAME=`cat ip_dns.map | grep $HOST | awk '{print $2}' | head -1`
ssh -t laowang@$HOST "sudo sed -i 's/HOSTNAME=${OLDNAME}/HOSTNAME=${NEWNAME}/g' /etc/sysconfig/network"
ssh -t laowang@$HOST "sudo hostname $NEWNAME"
echo "$HOST"
ssh -t laowang@$HOST 'sudo cat /etc/sysconfig/network | grep HOSTNAME'
ssh -t laowang@$HOST hostname
done
  • #!/bin/bash:说明这是一个可执行的shell脚本程序
  • for HOST in `cat hosts`; do:这是一个shell脚本中的for循环,这里的HOST是一个变量,其中的值是执行文件cat hosts所得到的每一行内容。【这也就间接说明,如果要执行这个文件,就需要在当前目录下有hosts这个文件 】。需要注意的是,for语句中的HOST没有添加$符号。
  • OLDNAME = `ssh laowang@$HOST "hostname"`:这是一个赋值语句。分为以下几个步骤:
    (1)ssh laowang@$HOST以laowang这个身份登录到HOST变量值所表示的那台机器上,
    (2)然后执行hostname命令
    (3)最后将命令显示出来的值赋给OLDNAME
  • NEWNAME=`cat ip_dns.map | grep $HOST |awk '{print $2}' | head -1`:这个命令稍微复杂,分为如下几步执行:
    (1)cat ip_dns.map这个是查看ip_dns.map文件中的内容。【所以能够看出来ip_dns.map是一个ip到dns的映射,这个需要自己创建】
    (2)| grep $HOST这个就是将步骤(1)输出中的内容中查找包含$HOST的字符串,
    (3)| awk '{print $2}'这个就是将步骤(2)过滤得到的内容中的第二列打印出来
    (4)| head -1:就是取步骤(3)中首先出现的第二列【第一行,第二列的那个值】
  • ssh -t laowang@$HOST "sudo sed -i 's/HOSTNAME=${OLDNAME}/HOSTNAME=${NEWNAME}/g' /etc/sysconfig/network"中的sed -i 's/HOSTNAME=${OLDNAME}/HOSTNAME=${NEWNAME}/g' /etc/sysconfig/network是一个查找替换命令。
    具体的意思是:查找/etc/sysconfig/network这个文件中的HOSTNAME=OLDNAME这个内容,并将其替换成HOSTNAME=NEWNAME。其中OLDNAME和NEWNAME都是变量。
  • 后面的就是比较雷同的内容了,不再啰嗦。

四.执行结果

  • 1.hosts文件
[root@littlelawson ~]# cat hosts
192.168.211.4
192.168.211.5
  • changHostname.sh【脚本文件】
[root@littlelawson ~]# cat changeHostname.sh 
#!/bin/bash
for HOST in `cat hosts`;do
OLDNAME=`ssh root@$HOST "hostname"`
NEWNAME=`cat ip_dns.map | grep $HOST | awk '{print $2}' | head -1`
ssh -t root@$HOST "sudo sed -i 's/HOSTNAME=${OLDNAME}/HOSTNAME=${NEWNAME}/g' /etc/sysconfig/network"
ssh -t root@$HOST "sudo hostname $NEWNAME"
echo "$HOST"
ssh -t root@$HOST 'sudo cat /etc/sysconfig/network | grep HOSTNAME'
ssh -t root@$HOST hostname
done
  • ip_dns.map文件【从ip到hostname的映射】
[root@littlelawson ~]# cat ip_dns.map 
192.168.211.4 server4
192.168.211.5 server5
  • 运行结果如下:
[root@littlelawson ~]# bash changeHostname.sh
Connection to 192.168.211.4 closed.
Connection to 192.168.211.4 closed.
192.168.211.4
Connection to 192.168.211.4 closed.
server4
Connection to 192.168.211.4 closed.
Connection to 192.168.211.5 closed.
Connection to 192.168.211.5 closed.
192.168.211.5
Connection to 192.168.211.5 closed.
server5
Connection to 192.168.211.5 closed.

五.总结

  • ssh [email protected] "hostname"
    • 1.表示使用ssh命令以root身份登录到192.168.211.5这台服务器上
    • 2.接着运行命令”hostname”
  • cat test.txt | grep 'little'
    • 01.查询test.txt这个文件中包含’little’关键字的行,
    • 02.因为grep后面没有接文件,所以默认打印到屏幕缓冲区
    • 03.cat test.txt | grep 'little' > result.txt:将查询结果导出到(当前)目录下的result.txt中

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/80862042