不到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

 

posted on 2022-01-26 11:00  BoyTNT  阅读(126)  评论(0编辑  收藏  举报

导航