九、图形化脚本

多年来, shell脚本一直都被认为是枯燥乏味的。但如果你准备在图形化环境中运行脚本时,就未必如此了。有很多与脚本用户交互的方式并不依赖read和echo语句。

9.1 创建文本菜单

创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户了解脚本能做什么和不能做什么。通常菜单脚本会清空显示区域,然后显示可用的选项列表。用户可以按下与每个选项关联的字母或数字来选择选项。shell脚本菜单的核心是case命令。 case命令会根据用户在菜单上的选择来执行特定命令。

9.1.1 创建菜单布局

创建菜单的第一步显然是决定在菜单上显示哪些元素以及想要显示的布局方式。在创建菜单前,通常要先清空显示器上已有的内容。这样就能在干净的、没有干扰的环境中显示菜单了。clear命令用当前终端会话的terminfo数据来清理出现在屏幕上的文本。运行clear命令之后,可以用echo命令来显示菜单元素。默认情况下, echo命令只显示可打印文本字符。在创建菜单项时,非可打印字符通常也很有用,比如制表符和换行符。要在echo命令中包含这些字符,必须用-e选项。因此,命令如下:

[root@kittod ~]# echo -e "1.\tDisplay disk space"
1. Display disk space

这极大地方便了菜单项布局的格式化。只需要几个echo命令,就能创建一个看上去还行的菜单。

[root@kittod ~]# cat menu01.sh
#!/bin/bash

clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit menu\n\n"
echo -en "\t\tEnter option: "

最后一行的-en选项会去掉末尾的换行符。这让菜单看上去更专业一些,光标会一直在行尾等待用户的输入。

创建菜单的最后一步是获取用户输入。这步用read命令。因为我们期望只有单字符输入,所以在read命令中用了-n选项来限制只读取一个字符。这样用户只需要输入一个数字,也不用按回车键:

[root@kittod ~]# cat menu01.sh
#!/bin/bash

clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit menu\n\n"
echo -en "\t\tEnter option: "
read -n 1 option

[root@kittod ~]# bash menu01.sh
   Sys Admin Menu
   1. Display disk space
   2. Display logged on users
   3. Display memory usage
   0. Exit menu
   
   Enter option:

接下来,你需要创建自己的菜单函数。

9.1.2 创建菜单函数

shell脚本菜单选项作为一组独立的函数实现起来更为容易。这样你就能创建出简洁、准确、容易理解的case命令。

要做到这一点,你要为每个菜单选项创建独立的shell函数。创建shell菜单脚本的第一步是决定你希望脚本执行哪些功能,然后将这些功能以函数的形式放在代码中。

[root@kittod ~]# cat menu02.sh
#!/bin.bash 

function menu {
        clear
        echo 
        echo -e "\t\t\tSys admin Menu \n"
        echo -e "\t1. Display disk space"
        echo -e "\t2. Display logged on users"
        echo -e "\t3. Display memory usage"
        echo -e "\t0. Exit menu\n\n"
        echo -en "\t\tEnter option:"
        read -n 1 option
}
menu

这样一来,任何时候你都能调用menu函数来重现菜单。

9.1.3 添加菜单逻辑

现在你已经建好了菜单布局和函数,只需要创建程序逻辑将二者结合起来就行了。前面提到过,这需要用到case命令。case命令应该根据菜单中输入的字符来调用相应的函数。用默认的case命令字符(星号)来处理所有不正确的菜单项是种不错的做法。

下面的代码展示了典型菜单中case命令的用法。

menu
case $option in
0)
   break ;;
1)
   diskspace ;;
2)
   whoseon ;;
3)
   memusage ;;
*)
   clear
   echo "Sorry, wrong selection" ;;
esac

这段代码首先用menu函数清空屏幕并显示菜单。 menu函数中的read命令会一直等待,直到用户在键盘上键入了字符。然后, case命令就会接管余下的处理过程。 case命令会基于返回的字符调用相应的函数。在函数运行结束后, case命令退出。

9.1.4 整合 shell 脚本菜单

现在已经看到了构成shell脚本菜单的各个部分,让我们将它们组合在一起,看看彼此之间是如何协作的。这里是一个完整的菜单脚本的例子。

[root@kittod ~]# cat menu03.sh
#!/bin.bash 

function diskspace {
        clear
        df -k
}
function whoseon {
        clear
        who
}
function memusage {
        clear
        cat /proc/meminfo
}
function menu {
        clear
        echo 
        echo -e "\t\t\tSys admin Menu \n"
        echo -e "\t1. Display disk space"
        echo -e "\t2. Display logged on users"
        echo -e "\t3. Display memory usage"
        echo -e "\t0. Exit menu\n\n"
        echo -en "\t\tEnter option:"
        read -n 1 option
}
while [ 1 ]
do
        menu
        case $option in
                0)
                        break ;;
                1)
                        diskspace ;;
                2)
                        whoseon ;;
                3)
                        memusage ;;
                *)
                        clear
                        echo "Sorry,wrong selection" ;;
        esac
                echo -en "\n\n\t\t\tHit ant key to continue"
                read -n 1 line
done
clear
                                              

这个菜单创建了三个函数,利用常见的命令提取Linux系统的管理信息。它使用while循环来一直菜单,除非用户选择了选项0,这时,它会用break命令来跳出while循环。可以用这个模板创建任何shell脚本菜单界面。它提供了一种跟用户交互的简单途径。

9.1.5 使用 select 命令

创建文本菜单的一半工夫都花在了建立菜单布局和获取用户输入。 bashshell提供了一个很容易上手的小工具,帮助我们自动完成这些工作。

select命令只需要一条命令就可以创建出菜单,然后获取输入的答案并自动处理。 select命令的格式如下

select variable in list
do
   commands
done

list参数是由空格分隔的文本选项列表,这些列表构成了整个菜单。 select命令会将每个列表项显示成一个带编号的选项,然后为选项显示一个由PS3环境变量定义的特殊提示符。

注意:PS1变量补充

[root@kittod ~]# echo $PS1
[\u@\h \W]\$
PS1的常用参数以及含义:
  \d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
  \H :完整的主机名称
  \h :仅取主机名中的第一个名字
  \t :显示时间为24小时格式,如:HH:MM:SS
  \T :显示时间为12小时格式
  \A :显示时间为24小时格式:HH:MM
  \u :当前用户的账号名称
  \v :BASH的版本信息
  \w :完整的工作目录名称
  \W :利用basename取得工作目录名称,只显示最后一个目录名
  \# :下达的第几个命令
  \$ :提示字符,如果是root用户,提示符为 # ,普通用户则为 $
  
颜色设置参数
  在PS1中设置字符颜色的格式为:\[\e[F;Bm\]........\[\e[0m\],其中“F“为字体
颜色,编号为30-37,“B”为背景颜色,编号为40-47,\[\e[0m\]作为颜色设定的结束。
  颜色对照表:
    F B
    30 40 黑色
    31 41 红色
    32 42 绿色
    33 43 黄色
    34 44 蓝色
    35 45 紫红色
       36 46 青蓝色
    37 47 白色
  只需将对应数字套入设置格式中即可。
  比如要设置命令行的格式为绿字黑底(\[\e[32;40m\]),显示当前用户的账号名称
(\u)、主机的第一个名字(\h)、完整的当前工作目录名称(\w)、24小时格式时间(\t),可以
直接在命令行键入如下命令:
# PS1='[\[\e[32;40m\]\u@\h \w \t]$ \[\e[0m\]'
也可以尝试:
# PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\
[\e[0m\]]\\$ "

如果需要永久保存,保存到用户变量文件中。

注意:PS2变量补充

一个非常长的命令可以通过在末尾加 \ 使其分行显示

PS2多行命令的默认提示符,默认值是 >

[root@kittod ~]# echo \
> ^C
[root@kittod ~]# PS2=">+ "
[root@kittod ~]# echo \
>+

注意:PS3变量补充

你可以像下面示范的那样,用环境变量PS3定制shell脚本的select提示:

没有PS3提示符时候的情况:
[root@kittod ~]# cat ps3.sh
select i in mon tue wed exit
do
   case $i in
     mon) echo "Monday";;
     tue) echo "Tuesday";;
     wed) echo "Wednesday";;
   exit) exit;;
   esac
 done
[root@kittod ~]# bash ps3.sh
1) mon
2) tue
3) wed
4) exit
#? 1
Monday
#? 2
Tuesday
#? 3
Wednesday
#? 4
有PS3提示符的时候的情况:
[root@kittod ~]# cat ps301.sh
PS3="Select a day (1-4): "
select i in mon tue wed exit
do
   case $i in
     mon) echo "Monday";;
     tue) echo "Tuesday";;
     wed) echo "Wednesday";;
     exit) exit;;
   esac
done

[root@kittod ~]# bash ps301.sh
1) mon
2) tue
3) wed
4) exit
Select a day (1-4): 1
Monday
Select a day (1-4): 2
Tuesday
Select a day (1-4): 3
Wednesday
Select a day (1-4): 4

这里有一个select命令的简单示例。

[root@kittod ~]# cat menu04.sh
#!/bin/bash
function diskspace {
   clear
   df -k
}
function whoseon {
   clear
   who
}
function memusage {
   clear
   cat /proc/meminfo
}
PS3="Enter option: "
select option in "Display disk space" "Display logged on users" "Display memory usage" "Exit program"
do
   case $option in
   "Exit program")
     break ;;
   "Display disk space")
     diskspace ;;
   "Display logged on users")
     whoseon ;;
   "Display memory usage")
     memusage ;;
   *)
     clear
     echo "Sorry, wrong selection" ;;
   esac
done
clear

select语句中的所有内容必须作为一行出现。这可以从行接续字符中看出。运行这个程序时, 它会自动生成如下菜单。

[root@kittod ~]# bash menu04.sh
1) Display disk space 3) Display memory usage
2) Display logged on users 4) Exit program
Enter option: 1
...

在使用select命令时,记住,存储在变量中的结果值是整个文本字符串而不是跟菜单选项相关联的数字。文本字符串值才是你要在case语句中进行比较的内容。

9.2 创建文本图形脚本

使用文本菜单没错,但在我们的交互脚本中仍然欠缺很多东西,尤其是相比图形化窗口而言。dialog包最早是由Savio Lam创建的一个小巧的工具,现在由Thomas E. Dickey维护。该包能够用ANSI转义控制字符在文本环境中创建标准的窗口对话框。你可以轻而易举地将这些对话框融入自己的shell脚本中,借此与用户进行交互。

检查系统是否安装,如果没有安装则进行安装:

[root@kittod ~]# dnf install dialog

9.2.1 dialog软件包

dialog命令使用命令行参数来决定生成哪种窗口部件( widget)。部件是dialog包中窗口元素类型的术语。

dialog包现在支持下表中的部件类型:

正如在表中看到的,我们可以选择很多不同的部件。只用多花一点工夫,就可以让脚本看起来更专业。

要在命令行上指定某个特定的部件,需使用双破折线格式。

dialog --widget parameters

其中widget是表中的部件名, parameters定义了部件窗口的大小以及部件需要的文本。每个dialog部件都提供了两种形式的输出:

·使用STDERR

·使用退出状态码

可以通过dialog命令的退出状态码来确定用户选择的按钮。如果选择了Yes或OK按钮,dialog命令会返回退出状态码0。如果选择Cancel或No按钮, dialog命令会返回退出状态码1。可以用标准的$?变量来确定dialog部件中具体选择了哪个按钮。

如果部件返回了数据,比如菜单选择,那么dialog命令会将数据发送到STDERR。可以用标准的bash shell方法来将STDERR输出重定向到另一个文件或文件描述符中。

dialog --inputbox "Enter your age:" 10 20 2>age.txt

这个命令会将文本框中输入的文本重定向到age.txt文件中。

[root@kittod ~]# cat age.txt
20[root@kittod ~]#

9.2.2 部件演示

1、消息框
[root@kittod ~]# dialog --title "Testing" --msgbox "This is a test" 10 20

2、yesno 框
[root@kittod ~]# dialog --title "Yes/No" --no-shadow --yesno "Delete the file /tmp/test.txt?" 10 20

3、输入框
[root@kittod ~]# dialog --title "Input your name" --inputbox "Please input your name:" 10 20  2>/tmp/name.txt

[root@kittod ~]# cat /tmp/name.txt
hehe[root@kittod ~]#
4、密码框
[root@kittod ~]# dialog --title "Password" --passwordbox "Please give a password for the new user: " 10 20

这样我们的密码就暴露出来了,不是很不安全,所以通常我们会加上一个安全选项,-- insecure 将每个字符用 * 来显示出来

5、文本框
[root@kittod ~]# dialog --title "The fstab" --textbox /etc/fstab 10 40

6、菜单框
[root@kittod ~]# dialog --title "Pick a choice" --menu "Choose one" 12 35 5 1 "say hello to everyone" 2 "thanks for your support" 3 "exit"

7、文本选择框
[root@kittod ~]# dialog --title "Pick a choice" --fselect /root/ 7 40

8、复选框
格式:
dialog --checklist "Test" height width menu-height tag1 item1 tag2
item2 …

[root@kittod ~]# dialog --backtitle "Checklist" --checklist "Test" 20 50 10 Memory Memory_Size 1 Disk Disk_size 2

9、显示日历
格式:
dialog --calendar "Date" height width day month year

[root@kittod ~]# dialog --title "Calendar" --calendar "Date" 5 50

10、进度框架
dialog --gauge text height width [<percent>]

·固定进度显示

[root@kittod ~]# dialog --title "installtion pro" --gauge "installtion" 10 30 10

·实时动态进度

[root@kittod ~]# for i in {1..100};do echo $i;done | dialog --title "installation pro" --gauge "installtion" 10 30

·编辑到脚本中

[root@kittod ~]# cat gauge01.sh
#!/bin/bash
declare -i PERCENT=0
(
   for I in /etc/*;do
     if [ $PERCENT -le 100 ]; then
         cp -r $I /tmp/test 2> /dev/null
         echo "XXX"
         echo "Copy the file $I ..."
         echo "XXX"
         echo $PERCENT
      fi
      let PERCENT+=1
      sleep 0.1
   done
) | dialog --title "coping" --gauge "starting to copy files..." 6 50 0

11、表单框架
dialog --form text height width formheight [ label y x item y x flen ilen ] ...

其中,

·flen 表示 Field Length,定义了:选定字段中显示的长度

·ilen 表示 Input Length,定义了:输入的数据允许的长度

使用 Up/Down(或 Ctrl - N,Ctrl - P)在使用领域之间移动。使用 Tab 键在窗口之间切换。

[root@kittod ~]# dialog --title "Add a user" --form "please input the
information of new user: " 12 40 4 \
> "Username: " 1 1 "" 1 15 15 0 \
> "Fullname: " 2 1 "" 2 15 15 0 \
> "HomeDir: " 3 1 "" 3 15 15 0 \
> "Shell: " 4 1 "" 4 15 15 0

9.2.3 综合应用实例

[root@kittod ~]# cat dia01.sh
#!/bin/bash

yesno(){
dialog --title "First screen" --backtitle "Test Program" --clear --yesno \
   "Start this test program or not ? \nThis decesion have to make by you. " 16 51
   # yes is 0, no is 1 ,esc is 255
   result=$?
   if [ $result -eq 1 ]; then
     exit 1;
   elif [ $result -eq 255 ]; then
     exit 255;
   fi
 username
}

username(){
 cat /dev/null > /tmp/test.username
 dialog --title "Second screen" --backtitle "Test Program" --clear --inputbox \
     "Please input your username (default: hello) " 16 51 "hello" 2>/tmp/test.username
       result=$?
     if [ $result -eq 1 ]; then
         yesno
     elif [ $result -eq 255 ]; then
       exit 255;
      fi
     password
}

password(){
     cat /dev/null >/tmp/test.password
     dialog --insecure --title "Third screen" --backtitle "Test Program" --clear --passwordbox "Please input your password (default: 12345) " 16 51 "12345" 2>/tmp/test.password
     result=$?
     if [ $result -eq 1 ];then
         username
     elif [ $result -eq 255 ]; then
         exit 255;
     fi
     occupation
}

occupation(){
 cat /dev/null > /tmp/test.occupation
 dialog --title "Forth screen" --backtitle "Test Program" --clear --menu \
     "Please choose your occupation: (default: IT)" 16 51 3 \
     IT "The worst occupation" \
     CEO "The best occupation" \
     Teacher "Not the best or worst" 2> /tmp/test.occupation
 result=$?
 if [ $result -eq 1 ]; then
     password
 elif [ $result -eq 255 ]; then
     exit 255;
 fi
 finish
}

finish(){
 dialog --title "Fifth screen" --backtitle "Test Program" --clear --msgbox \
   "Congratulations! The test program has finished !\n Username:
$(cat /tmp/test.username)\n Password: $(cat /tmp/test.password)\n
Occupation: $(cat /tmp/test.occupation)" 16 51
   result=$?
   if [ $result -eq 1 ]; then
     occupation
     elif [ $result -eq 255 ]; then
       exit 255;
   fi
}

yesno

执行该脚本:

9.3 创建真正图形的脚本

如果想给交互脚本加入更多的图形元素,你可以再进一步。 KDE和GNOME桌面环境都扩展了dialog命令的思路,包含了可以在各自环境下生成X Window图形化部件的命令。

KDE图形化环境默认包含kdialog包。 kdialog包使用kdialog命令在KDE桌面上生成类似于dialog式部件的标准窗口。生成的窗口能跟其他KDE应用窗口很好地融合,不会造成不协调的感觉。这样你就可以直接在shell脚本中创建能够和Windows相媲美的用户界面了。

GNOME图形化环境支持两种流行的可生成标准窗口的包:

·gdialog

·zenity

zenity是大多数GNOME桌面Linux发行版上最常见的包 这个包可以创建真正的基于图形窗口的脚本。我们的操作系统在安装时使用了GNOME图形环境,而在默认环境里,系统已经安装了zenity软件包。所以我们可以使用该软件来创建真正的图形脚本。

9.3.1 基本命令

查看日历

[root@kittod ~]# zenity --calendar 1

查看文件选择

[root@kittod ~]# zenity --file-selection

9.3.2 综合实例

[root@kittod ~]# cat zen01.sh
#!/bin/bash

temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp.XXXXXX`

function diskspace(){
	df -h > $temp
	zenity --text-info --title "Disk space" --filename=$temp --width 750 --height 10
}

function whoseon(){
	who > $temp
	zenity --text-info --title "Logged in users" --filename=$temp --width 750 --height 10
}

function memusage(){
	cat /proc/meminfo > $temp
	zenity --text-info --title "Memory usage" --filename=$temp --width 750 --height 10
}

while [ 1 ]
do
	zenity --list --radiolist --title "Sys Admin Menu" --column "Select" --column "Menu Item" FALSE "Display disk space" FALSE "Display users" FALSE "Display memory usage" FALSE "Exit" > $temp2
       if [ $? -eq 1 ]
       then 
		break;
       fi
       selection=$(cat $temp2)
case $selection in
	"Display disk space")
		diskspace;;
	"Display users")
		whoseon;;
	"Display memory usage")
		memusage;;
	"Exit")
		break;;
	*)
		zenity --info "Sorry, invalid selection"
	esac
done

由于zenity并不支持菜单对话窗口,我们改用单选列表窗口来作为主菜单,如上所示。该单选列表用了两列,每列都有一个标题:第一列包含用于选择的单选按钮,第二列是选项文本。单选列表也不用选项里的标号。当选定一个选项时,该选项的所有文本都会返回到

STDOUT。这会让case命令的内容丰富一些。必须在case中使用选项的全文本。如果文本中有任何空格,你需要给文本加上引号。

使用zenity包,你可以给GNOME桌面上的交互式shell脚本带来一种Windows式的体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644291.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从浮点数定义到FP8: AI模型中不同的数据类型

背景&#xff1a;AI模型中不同的数据类型对硬件算力和内存的需求是不同的&#xff0c;为了提高模型在硬件平台的吞吐量&#xff0c;减少数据通信带宽需求&#xff0c;往往倾向于将高位宽数据运算转向较低位宽的数据运算。本文通过重新回顾计算机中整数和浮点数的定义&#xff0…

从0开始带你成为Kafka消息中间件高手---第二讲

从0开始带你成为Kafka消息中间件高手—第二讲 那么在消费数据的时候&#xff0c;需要从磁盘文件里读取数据后通过网络发送出去&#xff0c;这个时候怎么提升性能呢&#xff1f; 首先就是利用了page cache技术&#xff0c;之前说过&#xff0c;kafka写入数据到磁盘文件的时候&…

Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把GRPC服务实现注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/g…

微信小程序上线必备:SSL证书申请以及安装

一、认识ssl证书 1、ssl证书是什么&#xff1f; SSL证书&#xff0c;全称Secure Socket Layer Certificate&#xff0c;是一种数字证书&#xff0c;它遵循SSL&#xff08;现在通常指TLS&#xff0c;Transport Layer Security&#xff09;协议标准&#xff0c;用于在客户端&…

C++ vector类

目录 0.前言 1.vector介绍 2.vector使用 2.1 构造函数(Constructor) 2.1.1. 默认构造函数 (Default Constructor) 2.1.2 填充构造函数 (Fill Constructor) 2.1.3 范围构造函数 (Range Constructor) 2.1.4 拷贝构造函数 (Copy Constructor) 2.2 迭代器(Iterator) 2.2.…

封装了一个iOS水平方向瀑布流布局

首先查看效果图 是支持多分区的 思路就是和竖直方向上的瀑布流布局是一样的&#xff0c; 只不过这里记录的列是水平方向的&#xff0c;同时要记录下 当前最小的x 所在的列&#xff0c;其实原理和竖直方向上的是相同的 &#xff0c;下面贴出代码 父类layout中的代码 // // …

08-Fortran基础--Fortran内置函数分类总结

08-Fortran基础--Fortran内置函数分类总结 0 引言1 Fortran内置函数1.1 常用到数学函数1.2 字符串函数&#xff1a;1.3 数组函数&#xff1a;1.4 数值查询函数1.5 文件操作函数&#xff1a; 2 结语 0 引言 Fortran是一种很古老的编程语言&#xff0c;但它仍然广泛使用于科学计算…

使用LoRA进行高效微调:基本原理

Using LoRA for efficient fine-tuning: Fundamental principles — ROCm Blogs (amd.com) [2106.09685] LoRA: Low-Rank Adaptation of Large Language Models (arxiv.org) Parametrizations Tutorial — PyTorch Tutorials 2.3.0cu121 documentation 大型语言模型&#xf…

基于地理坐标的高阶几何编辑工具算法(7)——矩形绘制

文章目录 工具步骤应用场景示意图算法原理工具步骤 点击矩形绘制工具,点击三个点完成矩形绘制。 应用场景 用于在地图上快速绘制任意方向的矩形。 示意图 算法原理 点第一个点确定矩形的一个角点P1,也作为平移后的坐标原点,生成平移矩阵。点第二个点P2,确定矩形的一条边…

Studio 3T 2024.3 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持自然语言查询

Studio 3T 2024.3 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端&#xff0c;支持自然语言查询 The professional GUI, IDE and client for MongoDB 请访问原文链接&#xff1a;https://sysin.org/blog/studio-3t/&#xff0c;查看最新版。原创作品&#xff…

CentOS 7.9 邮箱部署——Postfix+Dovecot详细

PostfixDovecot 文章目录 PostfixDovecot资源列表基础环境一、部署DNS二、部署postfix和dovecot2.1、配置postfix2.2、配置dovecot2.3、创建邮件用户 三、发送邮件测试3.1、windows安装poxmail3.2、登录邮箱3.3、发送接收邮件 四、搭建SSL认证加密4.1、生成私钥4.2、生成公钥4.…

状态转换图

根据本章开头讲的结构化分析的第3条准则,在需求分析过程中应该建立起软件系统的行为模型。状态转换图(简称为状态图)通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。此外,状态图还指明了作为特定事件的结果系统将做哪些动作(例如,处理数据)。因此,状态图提供了…

iMX6ULL 嵌入式linux开发 | 4G无线广播终端实现方案介绍

现有的有线广播&#xff0c;如村上的大喇叭&#xff0c;需要布线&#xff0c;施工麻烦。借助现有的4G网络&#xff0c;传输音频流完全没问题&#xff0c;4G网络结合流媒体技术和MQTT消息传递实现设备间的同步推拉流。这种方案可以避免有线布线的麻烦&#xff0c;同时实现4G无线…

基于springboot+vue的智慧外贸平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Elasticsearch 分析器(内置分析器,自定义分析器,IK分析器)

Elasticsearch 分析器&#xff08;内置分析器&#xff0c;自定义分析器&#xff0c;IK分析器&#xff09; 内置分析器使用分析器自定义分析器中文分析器&#xff08;IK分析器&#xff09;安装使用添加词典 内置分析器 官网&#xff1a;https://www.elastic.co/guide/en/elasti…

如何确保大模型 RAG 生成的信息是基于可靠的数据源?

在不断发展的人工智能 (AI) 领域中&#xff0c;检索增强生成 (RAG) 已成为一种强大的技术。 RAG 弥合了大型语言模型 (LLM) 与外部知识源之间的差距&#xff0c;使 AI 系统能够提供更全面和信息丰富的响应。然而&#xff0c;一个关键因素有时会缺失——透明性。 我们如何能够…

翻译《The Old New Thing》- What‘s the deal with the EM_SETHILITE message?

Whats the deal with the EM_SETHILITE message? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071025-00/?p24693 Raymond Chen 2007年10月25日 简要 文章讨论了EM_SETHILITE和EM_GETHILITE消息在文档中显示为“未实现”的原因。这些…

Redis开发实战

单机部署安装 服务端下载&#xff0c;安装&#xff0c;启动去官网下载最新的版本&#xff1a;http://redis.io/download &#xff0c;这里用的是3.0.2解压后&#xff0c;进入解压好的文件夹redis的安装非常简单&#xff0c;因为已经有现成的Makefile文件&#xff0c;所以直接先…

NASA数据集——阿尔法喷气式大气实验甲醛(HCHO)数据

Alpha Jet Atmospheric eXperiment Formaldehyde Data 简介 阿尔法喷气式大气实验甲醛数据 阿尔法喷气式大气实验&#xff08;AJAX&#xff09;是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&#xff0c;旨在促进对加利福尼亚、内华达和太平洋沿岸地区的…

从0开始带你成为Kafka消息中间件高手---第一讲

从0开始带你成为Kafka消息中间件高手—第一讲 网站的用户行为日志&#xff0c;假设电商网站&#xff0c;我现在需要买一个阅读架&#xff0c;看书的架子 京东&#xff0c;我平时比较喜欢用的是京东&#xff0c;送货很快&#xff0c;自营商品&#xff0c;都是放在自己的仓库里…