• 不到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
  • 相关阅读:
    转:Asp.net Mvc4默认权限详细(上)
    UITableViewCell点击不能push解决方法
    Sublime Text3学习参考集
    Mac搭建学习PHP环境
    Xcode里如何修改类的名字
    Xib中设置控件的圆角、边框效果
    MarkDown的使用
    iOS UItextView监听输入特定字符跳转页面选择选项返回
    创建podspec文件,为自己的项目添加pod支持
    iOS单例模式
  • 原文地址:https://www.cnblogs.com/BoyTNT/p/15845813.html
Copyright © 2020-2023  润新知