类似于输入nmtui命令后会出现这样的GUI界面
在这里插入图片描述

最终实现效果:
在这里插入图片描述

如何在shell脚本中进行设计生成图形化页面(基于特定的功能业务)

在Linux中,whiptail 是一个非常有用的工具,它允许你在终端中创建交互式的对话框,从而为你的shell脚本添加一个简单的图形用户界面(GUI)。以下是一些基本的 whiptail 命令和它们的使用方法,以及如何使用它们来设计一个具有指定功能的GUI程序:

  1. 消息框(Message Box)
    用于显示一条消息,并且有一个确认按钮。

    whiptail --title "Message Box Title" --msgbox "Your message here" 10 60
    

    其中,10和60分别是对话框的高度和宽度。

  2. 是/否对话框(Yes/No Box)
    用于让用户选择是或否。

    if whiptail --yesno "Do you want to continue?" 10 60; then
        echo "You chose Yes."
    else
        echo "You chose No."
    fi
    

    如果用户选择“是”,脚本将继续执行;如果选择“否”,则会执行else部分的代码。

  3. 输入框(Input Box)
    用于让用户输入文本。

    value=$(whiptail --title "Input Box" --inputbox "Please enter your name:" 10 30)
    echo "Hello, $value!"
    

    用户输入的数据被存储在变量value中,然后通过echo命令显示出来。

  4. 菜单(Menu)
    用于显示一个带有选项的菜单。

    options=(1 "Option 1" 2 "Option 2" 3 "Option 3")
    choice=$(whiptail --title "Menu Example" --menu "Choose an option:" 15 45 5 \
    "${options[@]}" 3>&1 1>&2 2>&3)
    case $choice in
        1) echo "You chose Option 1.";;
        2) echo "You chose Option 2.";;
        3) echo "You chose Option 3.";;
    esac
    

    用户选择的结果储存在变量choice中,并通过case语句进行处理。

  5. 进度条(Progress Bar)
    用于显示一个进度条,模拟长时间运行的任务。

    (
    for i in {1..10}; do
        sleep 1
        whiptail --title "Progress Bar" --gauge "Doing some work, please wait..." 10 30 < <(echo "$i*10")
    done
    ) &
    

    在这个例子中,我们创建了一个子shell来模拟一个长期运行的任务。--gauge选项用于显示进度条,而进度信息通过一个子shell进程提供。

  6. 密码框(Password Box)
    用于安全地提示用户输入密码。

    password=$(whiptail --title "Password Box" --passwordbox "Please enter your password:" 10 30 3>&1 1>&2 2>&3)
    echo "The password is $password"
    

    出于安全原因,用户输入的字符不会在他/她键入时显示。

  7. 检查列表(Checklist)
    用于让用户选择多个选项。

    whiptail --title "Checklist" --checklist "Choose options" 15 40 3 \
    "1" "Option 1" ON \
    "2" "Option 2" OFF \
    "3" "Option 3" OFF 3>&1 1>&2 2>&3
    

    用户可以使用空格键选择或取消选择选项。

  8. 单选列表(Radiolist)
    用于让用户在多个选项中选择一个。

    whiptail --title "Radiolist" --radiolist "Choose an option" 15 60 4 \
    "1" "Option 1" ON \
    "2" "Option 2" OFF \
    "3" "Option 3" OFF 3>&1 1>&2 2>&3
    

    用户只能选择一个选项,通常使用空格键和光标键进行选择。

要设计一个具有指定功能的GUI程序,你可以结合上述不同的对话框类型,根据用户的需求和你的脚本功能来选择合适的对话框。例如,你可以使用消息框来显示欢迎信息,输入框来收集用户输入的数据,菜单来让用户选择不同的操作,进度条来显示任务的进度,等等。通过这种方式,你可以创建一个用户友好的交互式shell脚本。


以下是 whiptail 命令中各个选项的具体语法和用法:

  1. --title 选项:设置对话框的标题。
   whiptail --title "Message Box" --msgbox "This is a message box example." 10 30

这里 "Message Box" 是对话框的标题 。

  1. --msgbox 选项:创建一个消息框来显示一段信息。
   whiptail --title "Message Box" --msgbox "This is a message box example." 10 30

--msgbox 后面跟着的是要显示的消息文本,10 表示窗口的高度,30 表示窗口的宽度 。

  1. --yesno 选项:创建一个 yes/no 对话框,让用户进行二选一的选择。
   whiptail --title "Yes/No Box" --yesno "Choose between Yes and No." 10 60

用户选择的结果可以通过检查 $? 变量来确定,0 表示选择了 “yes”,1 表示选择了 “no” 。

  1. --yes-button--no-button 选项:用于自定义 yes/no 对话框中的按钮文本。
   whiptail --title "Yes/No Box" --yes-button "Man" --no-button "Woman" --yesno "What is your gender?" 10 60

这两个选项允许你为对话框的确认和取消按钮设置自定义文本。当选择左边选项的时候输出的是0,选择右边选项的时候输出的是1

  1. --inputbox 选项:创建一个输入框,让用户可以输入文本。
   value=$(whiptail --title "Input Box" --inputbox "Please enter your name:" 10 30)
   echo "Hello, $value!"

用户输入的内容可以通过命令替换存储在变量中 。

  1. --passwordbox 选项:创建一个密码输入框,输入的内容不会显示在屏幕上。
   password=$(whiptail --title "Password Box" --passwordbox "Please enter your password:" 10 30 3>&1 1>&2 2>&3)

这与 --inputbox 类似,但输入的字符不会显示,适用于密码等敏感信息的输入 。

  1. --menu 选项:创建一个菜单,让用户可以从中选择一个选项。
   whiptail --title "Menu Box" --menu "Choose an option:" 15 45 5 \
   "1" "Option 1" \
   "2" "Option 2" \
   "3" "Option 3" 3>&1 1>&2 2>&3

用户选择的结果会通过标准错误输出 。

  1. --radiolist 选项:创建一个单选按钮列表,让用户可以从多个选项中选择一个。
   whiptail --title "Radiolist Box" --radiolist "Choose an option:" 15 45 5 \
   "1" "Option 1" ON \
   "2" "Option 2" OFF \
   "3" "Option 3" OFF 3>&1 1>&2 2>&3

用户选择的结果会通过标准错误输出 。

  1. --checklist 选项:创建一个复选框列表,允许用户选择多个选项。
   whiptail --title "Checklist Box" --checklist "Choose options:" 15 45 5 \
   "1" "Option 1" ON \
   "2" "Option 2" OFF \
   "3" "Option 3" OFF 3>&1 1>&2 2>&3

用户选择的结果会通过标准错误输出,以空格分隔 。

  1. --gauge 选项:创建一个进度条,显示任务的进度。
    (
    for i in {1..10}; do
    sleep 1
    whiptail --title "Progress Bar" --gauge "Doing some work, please wait..." 10 30 < <(echo "$i*10%")
    done
    ) &
    
    进度信息可以通过管道传递给 whiptail 命令 。

whiptail命令一些选项的介绍

在这里插入图片描述

实现页面框及标题的样式选项—— --title

whiptail --title "JumpServerGUI-10.0.0.7" 

–msgbox

在这里插入图片描述

–yesno

yes/no确认选择框

–yes-button 和 --no-button

在这里插入图片描述

实现输入框的样式的选项—— --inputbox

在这里插入图片描述

–passwordbox

在这里插入图片描述

实现菜单栏样式的选项—— --menu

#!/bin/bash
test=$(whiptail --title "JumpServer" --menu "请选择菜单选项(光标上下选择):" 30 60 5 "1" "web01" "2" "web02" "3" "web03" "4" "web04" "5" "web05" 3>&1 1>&2 2>&3)
echo $test

在这里插入图片描述
解释:


这个命令使用了 whiptail 这个工具来创建一个文本模式的菜单界面。whiptail 通常用在Linux系统中,它允许用户在控制台中创建和显示图形文本界面对话框。下面是命令中各个参数的具体解释:

  • --title "JumpServer":设置对话框的标题为 “JumpServer”。

  • --menu "请选择菜单选项(光标上下选择):":指定对话框的类型为菜单(--menu),并设置菜单的提示信息为 “请选择菜单选项(光标上下选择):”。

  • 30 60 5:这三个数字分别指定了菜单对话框的行数、列数和菜单项在列表中的起始位置。在这个例子中,菜单高度为30行,宽度为60列,菜单项从第5行开始显示。

  • "1" "web01" "2" "web02" "3" "web03" "4" "web04" "5" "web05":这些是菜单中的选项。每两个字符串组成一个菜单项,第一个字符串是选项前的编号,第二个字符串是选项的描述。在这个例子中,有五个菜单项,分别标记为 “1” 到 “5”,对应的描述是 “web01” 到 “web05”。

  • 3>&1 1>&2 2>&3:这部分是文件描述符重定向的操作。具体来说:

    • 3>&1:将文件描述符3(通常不用于标准输入、输出或错误)重定向到文件描述符1(标准输出)。
    • 1>&2:将标准输出(文件描述符1)重定向到标准错误输出(文件描述符2)。
    • 2>&3:将标准错误输出(文件描述符2)重定向到文件描述符3。由于文件描述符3已经被重定向到标准输出,这实际上创建了一个循环,使得标准错误输出也被发送到标准输出。

这个命令的文件描述符重定向部分创建了一个循环,使得所有原本发送到标准输出和标准错误输出的内容都被发送到了标准输出。这可能是为了将所有输出统一发送到一个日志文件或其他输出设备。

总的来说,这个 whiptail 命令会显示一个菜单,让用户从五个选项中选择一个。用户的选择将被 whiptail 处理,并返回选择的菜单项的编号。这个编号可以被脚本捕获,并用于后续的逻辑处理。


实现单选框样式的选项—— --radiolist

在这里插入图片描述

#!/bin/bash

# 使用 whiptail 创建一个单选列表对话框
CHOICE=$(whiptail --title "My Radio List" \
--radiolist "Choose an option(上下移动光标,用空格选中)" 15 60 3 \
"Option 1" "This is option 1" ON \
"Option 2" "This is option 2" OFF \
3>&1 1>&2 2>&3)

# 检查 CHOICE 是否为空(即用户是否取消了对话框)
if [ -n "$CHOICE" ]; then
    echo "You chose: $CHOICE"
else
    echo "No choice was made."
fi

注:
上面脚本中的\ 是用来续行的,它允许命令跨多行书写,使得代码更加可读。在 Bash 脚本中,反斜杠(\)用作续行符,表示命令在下一行继续,而不是结束。

例如,考虑以下命令:

CHOICE=$(whiptail --title "My Radio List" \
--radiolist "Choose an option" 15 60 3 \
"Option 1" "This is option 1" ON \
"Option 2" "This is option 2" OFF \
3>&1 1>&2 2>&3)

在这个例子中,每一行的末尾都有一个反斜杠(\),它告诉 Bash shell 命令在下一行继续。这样,即使命令跨越了多行,它也会被当作一行来处理。

反斜杠续行符的作用是在命令行界面(CLI)或脚本中,当一行的长度超过了屏幕的宽度或者为了提高可读性时,将长命令分割成多行书写。这样,每个参数或命令的部分可以单独占据一行,使得整个命令的结构更加清晰。

在实际使用中,续行符后的换行可以有任意数量的空格,但通常为了美观和一致性,会紧跟在反斜杠后面。如果不需要续行,那么在行尾就不应该使用反斜杠。

实现多选框样式的选项—— --cheklist

在这里插入图片描述

实现进度条的样式的选项—— --gauge

在这里插入图片描述

在这里插入图片描述

生成图形化页面业务功能的shelll脚本练习

根据菜单安装对应的服务

在这里插入图片描述
不使用图形化:
在这里插入图片描述

根据菜单进行远程连接

在这里插入图片描述
无图形化的实现:
在这里插入图片描述

#!/bin/bash
src=$(whiptail --title "JumpServer-10.0.0.7" --inputbox "请输入你要推送的文件路径:" 10 60 "" 3>&1 1>&2 2>&3)
# 检测用户是否输入ok(状态码为0)
if [ $? -eq 0 -a -n "$src" ]
then
	dest=$(whiptail --title "JumpServer-10.0.0.7" --inputbox "请输入你要推送的文件到目标主机的位置的路径:" 10 60 "" 3>&1 1>&2 2>&3)
	if [ $? -eq 0 -a -n "$dest" ]
	then
		scp "$src" 172.16.1.8:"$dest" &> /dev/null
	else
		echo "请输入对端的路径且点击OK"
	fi
else
	echo "请输入本地的路径且点击OK"
fi

在这里插入图片描述

解释下面的脚本中的“3>&1 1>&2 2>&3”

我不明白的是为什么去掉“3>&1 1>&2 2>&3”这个之后,然后执行脚本,显示不了whiptail生成的图形化界面?反而加上之后才能显示?

#!/bin/bash
# 使用 whiptail 创建一个单选列表对话框
CHOICE=$(whiptail --title "My Radio List" --radiolist "Choose an option" 15 60 3 \
        "Option 1" "This is option 1" OFF \
        "Option 2" "This is option 2" ON \
        3>&1 1>&2 2>&3)
# 检查 CHOICE 是否为空(即用户是否取消了对话框)
if [ -n "$CHOICE" ]; then
    echo "You chose: $CHOICE"
else
    echo "No choice was made."
fi

脚本中,3>&1 1>&2 2>&3 这部分重定向操作实际上是用于处理 whiptail 命令的输出和错误流的。whiptail 是一个在文本模式下创建图形化界面的工具,它通常需要与 dialog 库一起使用。

在 Linux 中,每个进程都有三个标准的文件描述符:0(标准输入 stdin)、1(标准输出 stdout)和 2(标准错误 stderr)。默认情况下,whiptail 会将用户的选择输出到标准输出(stdout),而任何错误信息则输出到标准错误(stderr)。

  • 3>&1 将文件描述符 3(通常用于 whiptail 的输出)重定向到标准输出(stdout)。
  • 1>&2 将标准输出(stdout)重定向到标准错误(stderr)。
  • 2>&3 将标准错误(stderr)重定向到文件描述符 3。

这样的重定向操作实际上是将 whiptail 的输出和错误流进行了交换,使得 whiptail 的输出被重定向到了标准错误,而错误信息则被重定向到了 whiptail 的输出位置。这样做的目的是为了捕获 whiptail 的输出,同时避免错误信息干扰输出。

如果您去掉了这部分重定向操作,whiptail 可能无法正确地将输出发送到脚本期望的位置,导致无法显示图形化界面。这是因为 whiptail 需要将输出发送到一个特定的文件描述符,以便正确地渲染图形界面。如果没有正确的重定向,whiptail 的输出可能会被发送到其他地方,或者被错误地处理,从而导致图形界面无法显示。

简而言之,3>&1 1>&2 2>&3 这部分重定向操作对于确保 whiptail 能够正确地将输出发送到脚本期望的位置是必要的。如果没有这部分重定向,whiptail 可能无法正确地渲染图形界面,导致无法显示。

再解释:


A:
因为这个命令有图形化,所以多一种输出类型
然后这个命令1还是标准输出,2还是错误输出,但是你想要都显示在图形化里,那必须,1 2 3输出到一起去
所以 3>&1 1>&2 2>&3
这也是这条命令必须加的,否则你啥也看不到

Q:
那是说 以后遇到了涉及了会有3这个类型命令(whiptail命令这种类型的)的输出结果赋值到新的变量里时,那么$()里的后面都要加“3>&1 1>&2 2>&3”是吗?

A:
不是
以后也不会有
每个命令也不一样就算有3,它也不一定是图形化
nginx有20多个文件描述符
他也有3
它用这么写嘛?

Q:
也是哈
这个命令特殊
那这个写法是只适用这个whiptail命令是吗?

A:

因为要把输出内容,都输出到图形化上
要不然默认标准输出是输出在终端上
不是在图里
对吧?

Q:
是的 确实需要都放在图里 那么把那些输出都放在图里的话 就和单独执行whiptail命令一样的是吧?或许是不是和父子shell有关系?

A:
用这个命令的时候,图形化就是你终端的子shell,当然有关系啊



  • 默认情况下,whiptail 的输出是通过 标准输出 返回的,也就是文件描述符 1
  • 但是,运行时终端的输出会混合标准输出和标准错误(stderr),如果没有适当的重定向,whiptail 的输出不会正确传递给 CHOICE 变量。
  • 3>&1 1>&2 2>&3 是为了交换文件描述符,使得 whiptail 的输出可以在错误输出中被捕获,从而确保 CHOICE 能正确存储用户的选择。

实现图像化跳板机

在这里插入图片描述
根据您提供的图片内容,我们可以创建一个 shell 脚本,使用 whiptail 来实现一个简单的菜单系统,该系统将提供以下功能:

  1. SSH远程连接
  2. 推送文件
  3. 查看磁盘空间
  4. 查看内存空间
  5. 查看服务状态
  6. 批量执行命令
  7. 轻松一下(game)
  8. 退出

以下是一个基本的 shell 脚本示例,使用 whiptail 创建菜单,并根据用户的选择执行相应的命令:

#!/bin/bash

# 定义一个函数来处理菜单选择
perform_action() {
    case "$1" in
        1)
            echo "SSH远程连接功能"
            # 在这里添加SSH远程连接的代码
            ;;
        2)
            echo "推送文件功能"
            # 在这里添加推送文件的代码
            ;;
        3)
            echo "查看磁盘空间"
            df -h
            ;;
        4)
            echo "查看内存空间"
            free -h
            ;;
        5)
            echo "查看服务状态"
            # 在这里添加查看服务状态的代码
            ;;
        6)
            echo "批量执行命令"
            # 在这里添加批量执行命令的代码
            ;;
        7)
            echo "轻松一下,玩个游戏"
            # 在这里添加游戏的代码
            ;;
        8)
            echo "退出系统"
            exit 0
            ;;
        *)
            echo "未知选项"
            ;;
    esac
}

# 使用whiptail创建菜单
CHOICE=$(whiptail --title "曾老混跳板机-10.0.0.61 菜单" --menu "请选择一个选项" 15 60 4 \
    "1" "SSH远程连接" \
    "2" "推送文件" \
    "3" "查看磁盘空间" \
    "4" "查看内存空间" \
    "5" "查看服务状态" \
    "6" "批量执行命令" \
    "7" "轻松一下(game)" \
    "8" "退出" 3>&1 1>&2 2>&3)

# 根据选择执行相应的函数
case $CHOICE in
    1|2|3|4|5|6|7)
        perform_action $CHOICE
        ;;
    8)
        echo "退出系统"
        exit 0
        ;;
    *)
        echo "未选择有效选项"
        ;;
esac

# 可以在这里添加更多的逻辑或者循环来再次显示菜单

请注意,这个脚本只是一个框架,您需要根据实际情况填写每个选项的具体实现代码。例如,SSH远程连接可能需要使用 ssh 命令,推送文件可能需要使用 scprsync 命令等。

要使用这个脚本,请将其保存为 .sh 文件,例如 menu.sh,然后在终端中给予执行权限并运行:

chmod +x menu.sh
./menu.sh

这将显示一个菜单,允许用户选择不同的选项,并根据选择执行相应的操作。

Logo

一站式 AI 云服务平台

更多推荐