不到100行代码实现SHELL环境下图形化的IP设置功能
Linux字符界面想实现IP设置功能,一般要么让用户自己去手工改网卡配置文件,要么给用户写个命令行交互模式的小程序。其实在字符界面也能实现假的图形界面,一般管它叫TextUI模式,通过颜色、特殊字符、前景背景等方式实现个图型化的窗口。比如很多Linux发行版都会带的NetworkManager功能,就是TextUI模式,不过它太重量级了,本文探索一下用BASH自己实现一个非常简单的IP设置功能。
核心是使用whiptail,关于它的介绍各位可以自己搜索,用法很简单。要注意不是所有Linux发行版都默认安装,如果没有就自己安装一下,比如SUSE里它在newt组件包里,zypper install newt就可以安装上,很小。
完全代码不到100行,很简单,也没有考虑有效性验证等功能,尽量写了注释,各位自行参考。先上效果图:
上完整代码,注意此代码基于SUSE环境,如果在其它环境使用请相应调整:
1 #!/bin/bash 2 3 TITLE="Network Settings" #页面标题 4 IFCFG_FILE="/etc/sysconfig/network/ifcfg-eth0" #SUSE网卡配置文件 5 ROUTES_FILE="/etc/sysconfig/network/routes" #SUSE路由配置文件 6 7 IP="" 8 NETMASK="255.255.255.0" 9 GATEWAY="" 10 11 # 输入IP 12 function inputIp() { 13 while true; do 14 IP=$(whiptail --title "$TITLE" --inputbox "\n\nInput IP Address:" 13 60 $IP 3>&1 1>&2 2>&3) 15 if [ $? != 0 ]; then #用户选择Cancel则退出 16 exit 17 fi 18 if [ ! $IP = "" ]; then #输入不为空则有效,否则重输,此处还可加上校验 19 break; 20 fi 21 done 22 } 23 24 # 输入掩码 25 function inputMask() { 26 while true; do 27 NETMASK=$(whiptail --title "$TITLE" --inputbox "\n\nInput NETMASK:" 13 60 $NETMASK 3>&1 1>&2 2>&3) 28 if [ $? != 0 ]; then #用户选择Cancel则退出 29 exit 30 fi 31 if [ ! $NETMASK = "" ]; then #输入不为空则有效,否则重输,此处还可加上校验 32 break; 33 fi 34 done 35 } 36 37 # 输入网关 38 function inputGateway() { 39 while true; do 40 GATEWAY=$(whiptail --title "$TITLE" --inputbox "\n\nInput GATEWAY:" 13 60 $GATEWAY 3>&1 1>&2 2>&3) 41 if [ $? != 0 ]; then #用户选择Cancel则退出 42 exit 43 fi 44 if [ ! $GATEWAY = "" ]; then #输入不为空则有效,否则重输,此处还可加上校验 45 break; 46 fi 47 done 48 } 49 50 # 修改前确认 51 function confirm() { 52 if (whiptail --title "$TITLE" --yes-button "Confirm" --no-button "Cancel" --yesno "\n Please confirm your network settings:\n\n IPADDR = $IP\n NETMASK = $NETMASK\n GATEWAY = $GATEWAY" 15 60) then 53 CONFIRM=1 54 else 55 CONFIRM=0 56 fi 57 } 58 59 # 修改配置到文件并重启网络服务 60 function save() { 61 echo "IPADDR=$IP" > $IFCFG_FILE 62 echo "NETMASK=$NETMASK" >> $IFCFG_FILE 63 echo "STARTMODE=auto" >> $IFCFG_FILE 64 echo "BOOTPROTO=static" >> $IFCFG_FILE 65 echo "default $GATEWAY" > $ROUTES_FILE 66 67 systemctl restart network 68 } 69 70 # 完成提示 71 function finish() { 72 whiptail --clear --title "$TITLE" --msgbox "\n Network restarted successfully, press OK to continue." 10 60 73 } 74 75 76 ############ 脚本开始 ############ 77 78 inputIp #输入IP 79 inputMask #输入掩码 80 inputGateway #输入网关 81 confirm #确认 82 83 if [ $CONFIRM -eq 1 ]; then #用户已确认 84 { 85 echo 30 #先显示进度30% 86 save #保存并重启网络 87 echo 100 #完成后显示进度100% 88 } | (whiptail --title "$TITLE" --gauge "" 6 60 0) 89 finish #完成提示 90 fi