#!/bin/bash # -------------------------------------------------- # @author yangxiao # @date 2018-06-20 鍒涘缓鑴氭湰锛岄粯璁ゆ墍鏈夌綉鍗″仛鑱氬悎 # @date 2018-06-21 淇敼鑴氭湰锛屾柊澧炵綉鍗¢€夋嫨锛岄拡瀵归€夋嫨缃戝崱鍋氳仛鍚 # @date 2018-06-22 淇敼鑴氭湰锛屾柊澧為厤缃綉鍗″紑鏈鸿嚜鍚姩 # -------------------------------------------------- # @update by yanghong8 # @date 2018-09-07 鍦ㄥ師鍔熻兘涓婂氨杩涜浼樺寲 # -------------------------------------------------- # @update by x01279 # @date 2021-07-13 璋冩暣鑴氭湰锛屾洿閫傚悎UNV璁惧鐨勮仛鍚堟ā寮 # -------------------------------------------------- # @update by x01279 # @date 2022-01-17 璋冩暣鑴氭湰锛屽吋瀹筓NV瓒呰瀺鍚堣澶囩殑鑱氬悎妯″紡 # -------------------------------------------------- # @update by l09036 # @date 2023-11-27 璋冩暣鑴氭湰锛屽吋瀹规鎷夋搷浣滅郴缁 OLD_LANG=`echo $LANG` export LANG=zh_CN.utf8 checkip() { inputorigin="$1" strLen=$(expr length $inputorigin) #鍒ゆ柇杈撳叆IP鏄惁鏄幆鍥炲湴鍧€# if [ "$inputorigin" = "127.0.0.1" ] then echo "IP address can not be loopback IP address" return 1 elif [ "$strLen" -gt "15" ] || [ "$strLen" -lt "7" ] #鍒ゆ柇IP鍦板潃鐨勪綅鏁版槸鍚﹂潪娉? then echo "Wrong ip address,the length of ip address should be less than 15 and more than 7" return 1 fi #鍒ゆ柇IP鍦板潃鏄惁鍖呭惈闈炴硶瀛楃# teststring=${inputorigin#*[!0-9.]} if [ "$inputorigin" != "$teststring" ] then echo "IP address can only contain 0-9 and dot." return 1 fi for i in 0 1 2 3 do if [ $i = 0 ] #鍒ゆ柇绗竴涓暟瀛楁鏄惁闈炴硶# then ipval=${inputorigin%%.*} if [ -z "$ipval" ] then echo "ip0val:$ipval " return 1 fi iptmp0=${inputorigin#*.} if [ "$iptmp0" = "$inputorigin" ] then echo "$ipval error" return 1 fi if [ "$ipval" -le "0" ] #鍒ゆ柇绗竴涓暟瀛楁鏄惁灏忎簬绛変簬0# then echo "ip0 is smaller than 0 ,$ipval error" return 1 elif [ "$ipval" -eq "127" ] #鍒ゆ柇绗竴涓暟瀛楁鏄惁绛変簬127# then echo "ip0 equals to 127 ,$ipval error" return 1 elif [ "$ipval" -gt "223" ] #鍒ゆ柇绗竴涓暟瀛楁鏄惁澶т簬223# then echo "ip0 is greater than 223 ,$ipval error" return 1 elif [ `echo $ipval | grep ^0` ] then echo "ip0 ,$ipval error" return 1 fi elif [ $i = 1 ] #鍒ゆ柇绗簩涓暟瀛楁鏄惁闈炴硶# then ipval=${iptmp0%%.*} if [ -z "$ipval" ] then echo "ip1val:$ipval is null" return 1 fi iptmp1=${iptmp0#*.} if [ "$iptmp1" = "$iptmp0" ] then echo "$ipval error" return 1 fi if [ "$ipval" -lt "0" ] #鍒ゆ柇绗簩涓暟瀛楁鏄惁灏忎簬0# then echo "ip1 is smaller than 0 ,$ipval error" return 1 elif [ "$ipval" -gt "255" ] #鍒ゆ柇绗簩涓暟瀛楁鏄惁澶т簬255# then echo "ip1 is greater than 255 ,$ipval error" return 1 elif [ `echo $ipval | grep ^0` ] && [ $(expr length $ipval) -gt 1 ] then echo "ip1 ,$ipval error" return 1 fi elif [ $i = 2 ] #鍒ゆ柇绗笁涓暟瀛楁鏄惁闈炴硶# then ipval=${iptmp1%%.*} if [ -z "$ipval" ] then echo "ip2val:$ipval is null" return 1 fi iptmp2=${iptmp1#*.} if [ "$iptmp2" = "$iptmp1" ] then echo "$ipval error" return 1 fi if [ "$ipval" -lt "0" ] #鍒ゆ柇绗笁涓暟瀛楁鏄惁灏忎簬0# then echo "ip2 is smaller than 0 ,$ipval error" return 1 elif [ "$ipval" -gt "255" ] #鍒ゆ柇绗笁涓暟瀛楁鏄惁澶т簬255# then echo "ip2 is greater than 255 ,$ipval error" return 1 elif [ `echo $ipval | grep ^0` ] && [ $(expr length $ipval) -gt 1 ] then echo "ip2 $ipval error" return 1 fi elif [ $i = 3 ] #鍒ゆ柇绗洓涓暟瀛楁鏄惁闈炴硶# then ipval=${iptmp2%%.*} if [ -z "$ipval" ] then echo "ip3val:$ipval is null" return 1 fi if [ `echo $iptmp2 | grep [.]` ] #鍒ゆ柇绗洓涓暟瀛楁鍚庨潰鏄惁杩樻湁.# then echo "wrongwrongwrong$inputorigin " return 1 fi if [ "$ipval" -lt "0" ] #鍒ゆ柇绗洓涓暟瀛楁鏄惁灏忎簬0# then echo "ip3 is smaller than 0 ,$ipval error" return 1 elif [ "$ipval" -gt "255" ] #鍒ゆ柇绗洓涓暟瀛楁鏄惁澶т簬255# then echo "ip3 is great than 255 ,$ipval error" return 1 elif [ `echo $ipval | grep ^0` ] && [ $(expr length $ipval) -gt 1 ] then echo "ip3 ,$ipval error" return 1 fi fi done return 0 } bondcentos(){ echo "娆㈣繋浣跨敤缃戝崱缁戝畾鑴氭湰" echo "璇ヨ剼鏈渶鍦╮oot鐢ㄦ埛涓嬪畬鎴?寮€濮嬫晥楠岀敤鎴? user=`whoami` if [ "${user}" != "root" ];then echo "璇峰湪root鐢ㄦ埛涓嬫墽琛屾湰鑴氭湰锛? && echo "鍙傝€冨懡浠わ細su - root" && exit 0 else echo "褰撳墠鎵ц鐢ㄦ埛鏍¢獙姝g‘锛? fi net_pwd=/etc/sysconfig/network-scripts BAK=$net_pwd/bak if [ -d $BAK ] ;then rm -rf $BAK/* else mkdir $BAK fi echo "鎮ㄥ皢闇€瑕佽緭鍏ヤ互涓嬩俊鎭畬鎴愰厤缃? echo "----------------------------------------------------" echo "1-鏂板垱寤虹殑鑱氬悎缃戝崱缁戝畾鍚嶇О锛屽缓璁负bond0锛堟暟瀛?锛? echo "2-缃戝崱缁戝畾妯″紡,XOR鏂瑰紡鑱氬悎璁句负2,涓诲妯″紡璁句负1,闈欐€佽礋杞藉潎琛¤涓?" echo "3-鏈嶅姟鍣↖P鍦板潃," echo "4-鏈嶅姟鍣ㄥ瓙缃戞帺鐮?" echo "5-鏈嶅姟鍣ㄥ瓙缃戞帺鐮佷綅鏁?濡?55.255.255.0,涓嶱REFIX=24琛ㄧず鎰忔€濈浉鍚? echo "6-鏈嶅姟鍣ㄧ綉鍏?" echo "7-闇€瑕佺粦瀹氱殑瀹為檯缃戝崱鍚嶇О" echo "----------------------------------------------------" while true do read -p "1-鏂板垱寤虹綉鍗$粦瀹氬悕绉?" deviceName echo "鎮ㄥ凡缁忛厤缃粦瀹氬悕绉颁负: $deviceName" echo "2-璇烽€夋嫨缃戝崱缁戝畾妯″紡: 0 | 1 | 2 | 3 | 4 | 5 | 6 :" read -n 1 -p "(Default: type 2): " BondType echo case $BondType in 0) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-rr." BondType=balance-rr break;; 1) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? active-backup." BondType=active-backup break;; 2) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-xor." BondType=balance-xor break;; 3) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? broadcast." BondType=broadcast break;; 4) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? 802.3ad." BondType=802.3ad break;; 5) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-tlb." BondType=balance-tlb break;; 6) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-alb." BondType=balance-alb break;; *) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-xor" BondType=balance-xor break;; esac done read -p "3-鏈嶅姟鍣↖P鍦板潃:" Ipaddr echo "鎮ㄥ凡缁忚緭鍏ヨ澶嘔P涓 : $Ipaddr" read -p "4-鏈嶅姟鍣ㄥ瓙缃戞帺鐮?" Netmask echo "鎮ㄥ凡缁忚緭鍏ヨ澶囧瓙缃戞帺鐮佷负: $Netmask" read -p "5-鏈嶅姟鍣ㄥ瓙缃戞帺鐮佷綅鏁?" Prefix echo "鎮ㄥ凡缁忚緭鍏ヨ澶囧瓙缃戞帺鐮佷负: $Prefix" read -p "6-鏈嶅姟鍣ㄧ綉鍏产" Gateway echo "鎮ㄥ凡缁忚緭鍏ヨ澶囩綉鍏充负: $Gateway" if [ -f ${net_pwd}/ifcfg-$deviceName ];then mv ${net_pwd}/ifcfg-$deviceName $BAK fi touch ifcfg-$deviceName echo "DEVICE=$deviceName" >>ifcfg-$deviceName echo "NAME=$deviceName" >>ifcfg-$deviceName echo "BONDING_OPTS=\"miimon=100 updelay=0 xmit_hash_policy=1 downdelay=0 mode=$BondType\"" >>ifcfg-$deviceName echo "TYPE=Bond" >>ifcfg-$deviceName echo "BONDING_MASTER=yes" >>ifcfg-$deviceName echo "BOOTPROTO=none" >>ifcfg-$deviceName echo "USERCTL=no" >>ifcfg-$deviceName echo "NM_CONTROLLED=no" >>ifcfg-$deviceName echo "IPADDR=$Ipaddr" >>ifcfg-$deviceName echo "NETMASK=$Netmask" >>ifcfg-$deviceName echo "GATEWAY=$Gateway" >>ifcfg-$deviceName echo "DEFROUTE=yes" >>ifcfg-$deviceName echo "ONBOOT=yes" >>ifcfg-$deviceName mv ifcfg-$deviceName ${net_pwd}/ ADAPTER_NAME_ALL=`ip a|grep -E "en|em" |grep -v lo|awk -F ":" '{print $2}'|awk '{sub("^ *","");sub(" *$","");print}'` echo -e "浠ヤ笅鏄郴缁熻瘑鍒埌鐨勬墍鏈夌綉鍗狕\n\n$ADAPTER_NAME_ALL" echo "7-璇疯緭鍏ラ渶瑕佺粦瀹氱殑缃戝崱鍚嶇О,澶氫釜缃戝崱涔嬮棿鐢ㄨ嫳鏂囩┖鏍奸殧寮€,涓嶉渶瑕佽緭鍏ラ潤闈欑瓑鍊? read -p "缃戝崱鍚嶇О:" ethname for i in `echo $ethname` do cd ${net_pwd} echo "鍐欏叆浠ヤ笅閰嶇疆淇℃伅鍒板搴旂綉鍗′腑ifcfg-$i" echo "--------------------------------------------" mv ${net_pwd}/ifcfg-$i $BAK echo "DEVICE=$i" |tee -a ifcfg-$i echo "BOOTPROTO=none" |tee -a ifcfg-$i echo "MASTER=$deviceName" |tee -a ifcfg-$i echo "SLAVE=yes" |tee -a ifcfg-$i echo "NM_CONTROLLED=no" |tee -a ifcfg-$i echo "USERCTL=no" |tee -a ifcfg-$i echo "ONBOOT=yes" |tee -a ifcfg-$i echo "--------------------------------------------" done systemctl stop NetworkManager systemctl disable NetworkManager 2>&1 >/dev/null systemctl restart network } yesnoinput() { while : do read ANSWER case $ANSWER in "y"|"Y"|"yes"|"YES") return 0 ;; "n"|"N"|"no"|"NO") return 1 ;; *) echo "Unknown input." ;; esac printf "Please input [yes..no]:" done } checkbond(){ if [ ! -z "`nmcli c | grep bond`" ];then echo "褰撳墠鏈嶅姟鍣ㄥ凡鍒涘缓缃戝彛鑱氬悎锛岃閫夋嫨鏄惁鍒犻櫎閲嶅缓鍒涘缓[yes/no]:" yesnoinput if [ "$?" -eq 0 ];then echo "姝e湪鍒犻櫎鑱氬悎缃戝彛" for i in `nmcli c | grep bond | awk '{print $1}'` do nmcli connection delete ${i} done if [ -z "`nmcli c | grep bond`" ];then echo "鑱氬悎缃戝彛鍒犻櫎鎴愬姛锛? else echo "鑱氬悎缃戝彛鍒犻櫎澶辫触锛? exit 1 fi else echo "绋嬪簭閫€鍑? exit 0 fi fi } bondopenEuler(){ echo "娆㈣繋浣跨敤缃戝崱缁戝畾鑴氭湰" echo "璇ヨ剼鏈渶鍦╮oot鐢ㄦ埛涓嬪畬鎴?寮€濮嬫晥楠岀敤鎴? user=`whoami` if [ "${user}" != "root" ];then echo "璇峰湪root鐢ㄦ埛涓嬫墽琛屾湰鑴氭湰锛? && echo "鍙傝€冨懡浠わ細su - root" && exit 0 else echo "褰撳墠鎵ц鐢ㄦ埛鏍¢獙姝g‘锛? fi # 鍒ゆ柇褰撳墠鏄惁宸插垱寤虹綉鍙h仛鍚 checkbond # 姝よ剼鏈笉鏀寔瀛樺偍璁惧缃戝彛鑱氬悎锛屼娇鐢ㄥ瓨鍌ㄦ帶鍒跺彴璁剧疆缃戝彛鑱氬悎 if [ -f /proc/product/main_board ];then echo "姝よ澶囦负瀛樺偍璁惧锛岃鐧诲綍瀛樺偍鎺у埗鍙拌缃綉鍙h仛鍚堬紒" echo "瀛樺偍鎺у埗鍙帮細瀛樺偍璁惧榛樿80绔彛锛岃秴铻嶅悎锛圴MP-E600锛夎澶?078绔彛" exit 0 fi echo "鎮ㄥ皢闇€瑕佽緭鍏ヤ互涓嬩俊鎭畬鎴愰厤缃? echo "----------------------------------------------------" echo "1-鏂板垱寤虹殑鑱氬悎缃戝崱缁戝畾鍚嶇О锛屽缓璁负bond0锛堟暟瀛?锛? echo "2-缃戝崱缁戝畾妯″紡,XOR鏂瑰紡鑱氬悎璁句负2,涓诲妯″紡璁句负1,闈欐€佽礋杞藉潎琛¤涓?" echo "3-鏈嶅姟鍣↖P鍦板潃," echo "4-鏈嶅姟鍣ㄥ瓙缃戞帺鐮佷綅鏁?濡?55.255.255.0,涓嶱REFIX=24琛ㄧず鎰忔€濈浉鍚? echo "5-鏈嶅姟鍣ㄧ綉鍏?" echo "6-闇€瑕佺粦瀹氱殑瀹為檯缃戝崱鍚嶇О" echo "----------------------------------------------------" while true do read -p "1-鏂板垱寤虹綉鍗$粦瀹氬悕绉?" deviceName echo "鎮ㄥ凡缁忛厤缃粦瀹氬悕绉颁负: ${deviceName}" echo "2-璇烽€夋嫨缃戝崱缁戝畾妯″紡: 0 | 1 | 2 | 3 | 4 | 5 | 6 :" read -n 1 -p "(Default: type 2): " BondType echo case ${BondType} in 0) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-rr." BondType=balance-rr break;; 1) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? active-backup." BondType=active-backup break;; 2) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-xor." BondType=balance-xor break;; 3) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? broadcast." BondType=broadcast break;; 4) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? 802.3ad." BondType=802.3ad break;; 5) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-tlb." BondType=balance-tlb break;; 6) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-alb." BondType=balance-alb break;; *) echo "鎮ㄥ凡缁忛€夋嫨缁戝畾妯″紡涓? balance-xor" BondType=balance-xor break;; esac done while true do read -p "3-鏈嶅姟鍣↖P鍦板潃:" Ipaddr checkip ${Ipaddr} case "$?" in "0") echo "鎮ㄥ凡缁忚緭鍏ヨ澶嘔P涓国 ${Ipaddr}" break;; "1") echo "鎮ㄨ緭鍏ョ殑IP瀛樺湪闂锛岄渶瑕侀噸鏂拌緭鍏ワ細" ;; esac done while true do read -p "4-鏈嶅姟鍣ㄥ瓙缃戞帺鐮佷綅鏁?" Prefix testPrefix=${Prefix#*[!0-9]} if [ "${testPrefix}" != "${Prefix}" ];then echo "鎮ㄨ緭鍏ョ殑瀛愮綉鎺╃爜浣嶆暟瀛樺湪闂锛岄渶瑕侀噸鏂拌緭鍏ワ細" else if [ "$Prefix" -ge "0" ] && [ "$Prefix" -le "32" ];then echo "鎮ㄥ凡缁忚緭鍏ヨ澶囧瓙缃戞帺鐮佷綅鏁颁负: ${Prefix}" break else echo "鎮ㄨ緭鍏ョ殑瀛愮綉鎺╃爜鑼冨洿瀛樺湪闂锛岄渶瑕侀噸鏂拌緭鍏ワ細" fi fi done while true do read -p "5-鏈嶅姟鍣ㄧ綉鍏产" Gateway checkip ${Gateway} case "$?" in "0") echo "鎮ㄥ凡缁忚緭鍏ヨ澶囩綉鍏充负: ${Gateway}" break;; "1") echo "鎮ㄨ緭鍏ョ殑IP瀛樺湪闂锛岄渶瑕侀噸鏂拌緭鍏ワ細" ;; esac done ADAPTER_NAME_ALL=`ip a|grep -E "en|em" |grep -v lo|awk -F ":" '{print $2}'|awk '{sub("^ *","");sub(" *$","");print}'` echo -e "浠ヤ笅鏄郴缁熻瘑鍒埌鐨勬墍鏈夌綉鍗狕\n\n$ADAPTER_NAME_ALL" echo "6-璇疯緭鍏ラ渶瑕佺粦瀹氱殑缃戝崱鍚嶇О,澶氫釜缃戝崱涔嬮棿鐢ㄨ嫳鏂囩┖鏍奸殧寮€" read -p "缃戝崱鍚嶇О:" ethname # 鍒涘缓缃戝彛鑱氬悎鍛戒护 nmcli con add type bond ifname ${deviceName} con-name ${deviceName} mode ${BondType} for i in `echo ${ethname}` do nmcli con add type bond-slave ifname ${i} master ${deviceName} done nmcli con modify ${deviceName} ipv4.address ${Ipaddr}/${Prefix} ipv4.gateway ${Gateway} ipv4.method manual ipv6.method ignore nmcli con up ${deviceName} } ################################ main ############################### # 鍒ゆ柇鎿嶄綔绯荤粺绫诲瀷 if [ -f /etc/openEuler-release ];then bondopenEuler elif [ -f /etc/redhat-release ];then bondcentos else echo "[Warn] System type not supported." fi export LANG=$OLD_LANG