Linux Shell脚本实现自动化的网卡配置(CENTOS7修改非标配置为eth1)

 

#!/bin/sh
host=`hostname`
declare -A dict
dict=(["server1"]=["1.1.1.1","1.1.1.5"])
dict+=(["server2"]=["2.1.1.1","2.1.1.5"])

mac=`ifconfig -a | grep ether | awk '{print $2}' | sort | uniq -c | grep "1 " |  awk '{print $2}'`
mac_len=`ifconfig -a | grep ether | awk '{print $2}' | sort | uniq -c | grep "1 " |  awk '{print $2}' | wc -l`
touch /etc/udev/rules.d/70-persistent-net.rules
if [ "${mac_len}" == "2" ];then
a=0
p='eth4'
b=""
for line in ${mac};do
b="${b}SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$line\", ATTR{type}==\"1\", KERNEL==\"eth*\", NAME=$p\n"
temp=${dict[$host]}
IP=${temp[$a]}
cfg="DEVICE=${p}\nTYPE=\"Ethernet\"\nIPADDR=${IP}\nHWADDR=$line\nBOOTPROTO=static\nNETMASK=255.255.255.252\nONBOOT=yes\nETHTOOL_OPTS=\"speed 10000 duplex full autoneg on\""

echo -e $cfg >  /etc/sysconfig/network-scripts/ifcfg-$p
let a=a+1
p='eth5'
done
echo -e $b  > /etc/udev/rules.d/70-persistent-net.rules
sed -i 's/GRUB_CMDLINE_LINUX="crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us biosdevname=0 console=tty0 console=ttyS0,115200 scsi_mod.scan=sync intel_idle.max_cstate=0 pci=pcie_bus_perf ipv6.disable=1 rd.driver.pre=ahci"/GRUB_CMDLINE_LINUX="crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us biosdevname=0 console=tty0 console=ttyS0,115200 scsi_mod.scan=sync intel_idle.max_cstate=0 pci=pcie_bus_perf ipv6.disable=1 rd.driver.pre=ahci net.ifnames=0 biosdevname=0"/g' /etc/sysconfig/grub
fi

echo "net.ipv4.conf.all.rp_filter=0" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo 0 > /proc/sys/net/ipv4/conf/eth4/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth5/rp_filter
sysctl -p
sysctl -a | grep \\\.rp_filter

特别说明:

1.$IP还有点问题没解决----[尴尬]

2.对写代码的同学来说:赋值等号=前后不能加空格简直逼死强迫症 

3.对$p这种变量如果后面马上跟着一串字符,需要{}以区分普通字符

4.for循环的写法不是靠{}或者缩进完成,而是靠;do done结构完成。

5.echo一定是创建一个新文件(会覆盖),而sed一定是在老文件中做修改(如果文件不存在或为空,不会向其中添加内容)

6.双引号的文本中可以使用\n这种转义字符,单引号的不行。

7.双引号转义时,和正则表达式转义不一样,.*?这些都不用转义。因为本来也就没有特殊意义

8.CLI执行命令使用``将需要执行的命令括起来

 

~~~Update 20190821

dict内嵌list的方案没有搞明白,使用了一个变通方法,使用split来划分字符串

dict=(["server1"]="10.1.1.1_10.1.1.10")
dict+=(["server2"]="10.2.2.24_10.2.2.28")
OLD_IFS="$IFS" 
IFS="_" 
arr=($temp) 
IFS="$OLD_IFS" 
echo $arr
IP=${arr[$a]}

 

 

具体手工配置方法详见以下log:

https://blog.csdn.net/guotch/article/details/88670283

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值