---
# System prepended metadata

title: Roger_Dialog專案套件-完整版
tags: [linux]

---

# Roger_Dialog專案套件-UPT V2.0-完整版
* 專案目標：Roger_Dialog專案套件-UPT V2.0 專案使用說明書
* 專案名稱：UPT v2.0 (User Personal Toolbox)[ユーザー ツールボックス] 個人工具箱
* 專案想法：身為一個專業的Engineer,在應付各不同的作業環境的時候需要安裝各種程式及套件,每個Engineer都會有自己習慣使用的工具,這是四個月課程中常常需要使用的指令程式與工具的整合,如果有需要更換VM或電腦時用此工具可以更快速的部屬環境
* 創作者：Roger
* 創作日期：2024/2/29
* 最後更新：2024/3/2
* 適用系統：Ubuntu 20.04 up、Rucky Linux 8 up、CentOS 7 up

執行內容

* vim UPT.sh #新增一個sh檔，
  * 並給予執行權限 chmod +x UPT.sh

### 程式碼內容
```python=
dialog --title "Roger_Dialog安裝包專案" --msgbox "身為一個專業的工程師,當然要準備自己的小工具,這個工具的目的就是把平常需要使用的安裝程式,及功能打包成Dialog" 10 50

while true; do
    choice=$(dialog --title "選單模式" --menu "可上下選擇" 20 50 15 \
        1 "顯示網卡信息" \
        2 "查看Port" \
        3 "設置時區" \
        4 "查看現在時區" \
        5 "安裝程式" \
        6 "安裝PIP套件" \
        7 "ngrok token輸入" \
        8 "OpenAPI key" \
        9 "htop 系統訊息" \
        10 "啟動螢幕保護程式 cmatrix" \
        11 "解除安裝程式" \
        12 "ngrok port 輸入" \
        3>&1 1>&2 2>&3)

    # 檢查用戶選擇
    case $choice in
        1)
        # 創建一個臨時文件，用於保存 ifconfig 命令的輸出
            ifconfig_file=$(mktemp)
            # 運行 ifconfig 命令，並將輸出保存到臨時文件中
            ifconfig > "$ifconfig_file"
            # 使用 dialog 顯示臨時文件中的內容
            dialog --title "網卡訊息" --textbox "$ifconfig_file" 50 70 --extra-button --extra-label "返回"
            # 删除臨時文件
            rm "$ifconfig_file"
            # 用户選擇 ifconfig 命令
            ifconfig
            ;;
        2)
            # 創建一個臨時文件，用於保存 netstat 命令的輸出
            netstat_file=$(mktemp)
            # 運行 ifconfig 命令，並將輸出保存到臨時文件中
            netstat -tnpl > "$netstat_file"
            # 使用 dialog 顯示臨時文件中的内容
            dialog --title "網路通道Port" --textbox "$netstat_file" 50 70 --extra-button --extra-label "返回"
            # 刪除臨時文件
            rm "$netstat_file"
            # 執行 ifconfig 命令
            netstat -tnpl
            ;;
  
        3) 
            # 設置時區
            time_list=$(mktemp)
            timedatectl list-timezones > "$time_list" 
            chosen_zone=$(dialog --title "時區設置" --radiolist "選擇時區" 50 70 0 --file "$time_list" --stdout )
            if [ "$chosen_zone" = "extra" ]; then
                break
            fi
            sudo timedatectl set-timezone "$chosen_zone" >/dev/null 2>&1
            if [ -n "$chosen_zone" ]; then
                dialog --msgbox "時區已設置為 $chosen_zone" 10 30
            fi
            ;;

        4)
            # 查看現在時區
            time_now=$(mktemp)
            timedatectl > "$time_now"
            dialog --title "時區資訊" --textbox "$time_now" 15 60 --extra-button --extra-label "返回"
            ;;

        5)
            # 用戶選擇  安裝程式
            # 定義一個函數，用於安裝選定的軟件包
            install_packages() {
                selected_packages="$1"
                if [[ -n "$selected_packages" ]]; then
                    for package in $selected_packages; do
                        if dpkg -l | grep -q "ii  $package"; then
                            dialog --title "安裝成功" --msgbox "$package 已安裝" 15 60 --extra-button --extra-label "返回"
                        else
                            {       
                                  # 檢查是否要密碼
                                if sudo -n true 2>/dev/null; then
                                   sudo apt-get -y install $package
                                   echo "10" 
                                   sleep 1 
                                   echo "30"
                                   echo "50" 
                                   echo "80" 
                                   sleep 1
                                   echo "90" 
                                   sleep 1
                                else
                                    # 輸入密碼
                                    password=$(dialog --title "输入密碼" --clear --passwordbox "請輸入您的密碼:" 10 30 3>&1 1>&2 2>&3 3>&-)
                                    # 等待輸入密碼
                                    echo "$password" | sudo -S apt-get -y install $package 
                                    echo "10" 
                                    sleep 1
                                    echo "30"
                                    echo "50" 
                                    echo "80" 
                                    sleep 1
                                    echo "90" 
                                    sleep 1
                                fi    
                            } | dialog --title "安裝進度" --gauge "$package 正在安装..." 10 70 0
                            dialog --title "安装完成" --msgbox "$package 完成安装" 10 50
                        fi
                    done
                else
                    dialog --title "錯誤" --msgbox "沒有選擇任何安裝!" 30 50
                fi
            }


            # 定義一个函數，用于安装 ngrok
           # 定義一个函數，用于安装 ngrok
            install_ngrok() {
                # 初始化進度0%
                echo "0" > progress.txt
                # 安装 ngrok 的命令，将安装過程输出重定向到 progress.txt 文件中
                {   
                    echo "10" # 安装，進度 10%
                    sleep 1
                    echo "30" # 安装，進度 30%
                    echo "$password" | sudo -S curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null 2>&1
                    echo "50" # 安装，進度 50%
                    echo "$password" | sudo -S sh -c 'echo "deb https://ngrok-agent.s3.amazonaws.com buster main" > /etc/apt/sources.list.d/ngrok.list' >/dev/null 2>&1
                    echo "$password" | sudo -S apt update >/dev/null 2>&1
                    echo "60" # 安装，進度 60%
                    sleep 1
                    echo "$password" | sudo -S apt install ngrok >/dev/null 2>&1
                    echo "90" # 完成，進度 90%
                    sleep 1
                } | dialog --title "安裝進度" --gauge "正在安装..." 10 70 0

                # 顯示安装完成的消息
                dialog --title "完成安裝" --msgbox "Ngrok安裝完成!" 10 50
            }

            update_new(){
                # 檢查是否需要输入密碼
                if [[ "$selected" == "update" ]]; then
                    # 執行更新命令，將更新過程输出重定向到進度條中
                    {   
                        echo "10" # 安装，進度 10%
                        sleep 1
                        echo "30" # 安装，進度 10%
                        echo "$password" | sudo -S apt-get -y update >/dev/null 2>&1
                        echo "50" # 安装，進度 50%
                        sleep 1
                        echo "90" # 安装，進度 90%
                        sleep 1
                    } | dialog --title "更新進度" --gauge "正在更新..." 10 70 0
                else
                    # 提示用户输入密碼
                    #password=$(dialog --title "Password" --passwordbox "輸入密碼:" 10 50 3>&1 1>&2 2>&3)
                    # 執行更新命令
                    echo "$password" | sudo -S apt-get -y update >/dev/null 2>&1
                fi
                # 顯示更新完成的消息
                dialog --title "Update" --msgbox "Update 完成!" 10 50 
            }

            dist-upgrade_new(){
                # 檢查是否需要输入密碼
                if [[ "$selected" == "dist-upgrade" ]]; then
                    {   
                        echo "10" # 更新，進度 10%
                        echo "$password" | sudo -S apt-get -y dist-upgrade >/dev/null 2>&1 
                        echo "50" # 更新中，進度 50%
                        sleep 1
                        echo "90" # 更新完成，進度 90%
                        sleep 1
                    } | dialog --title "更新進度" --gauge "正在更新..." 10 70 0    

                    # 顯示升级完成的消息框\
                    dialog --title "dist-upgrade" --msgbox "dist-upgrade 完成!" 10 50
                    # 返回
                
                else
                    # 提示用户输入密碼
                    password=$(dialog --title "Password" --passwordbox "輸入密碼:" 10 50 3>&1 1>&2 2>&3)
                    # 執行升级命令
                    echo "$password" | sudo -S apt-get -y dist-upgrade >/dev/null 2>&1 
                    # 顯示升级完成的消息
                    dialog --title "dist-upgrade" --msgbox "dist-upgrade 完成!" 10 50
                fi
            }

            # 安裝包列表，每行一個，格式為 "安裝包名稱" "描述"
            packages=(
                "update" "用來取得遠端更新伺服器的套件檔案清單。"
                "dist-upgrade" "更新套件。"
                "apache2" "安裝 apache2"
                "net-tools" "安裝 net-tools"
                "openssh-server" "安裝SSH"
                "tree" "安裝tree"
                "curl" "安裝URL工具,安裝ngrok前必裝"
                "ngrok" "提供外部訪問本地伺服器的服務"
                "htop" "安裝htop查看,系統資訊"
                "cmatrix" "安裝炫爆螢幕保護程式"
                "mariadb-server" "安裝Mariadb-server"
                "mariadb-client" "安裝Mariadb-client"
            )

            while true; do
                # 構建選擇菜單
                selected=$(dialog --title "安裝選單" --menu "選擇要安裝的程式:" 20 50 15 "${packages[@]}" 3>&1 1>&2 2>&3)
                
                 # 如果用户選擇了返回，跳出循環返回上一頁
                if [[ -z "$selected" ]]; then
                    break
                # 如果用戶選擇了 ngrok，則調用函數安裝 install_ngrok
                elif [[ "$selected" == "ngrok" ]]; then
                    install_ngrok
                # 如果用戶選擇  update  則調用函數安裝 update_new
                elif [[ "$selected" == "update" ]]; then
                    update_new
                # 如果用戶選擇  upgrade 則調用函數安裝 dist-upgrade_new
                elif [[ "$selected" == "dist-upgrade" ]]; then
                    dist-upgrade_new
                    
                # 如果用戶選擇了其他安裝包，則調用函數安裝選中的安裝包
                elif [[ -n "$selected" ]]; then
                    install_packages "$selected"
                fi
            done	
            ;;
        6)
            # 選擇 "安裝PIP套件"
            # 定義一個函數，用於安裝選定的安裝包
            install_packages() {
                selected_packages="$1"
                # 檢查是否有選中的安裝包
                if [[ -n "$selected_packages" ]]; then
                    # 安裝選中的安裝包並將輸出重定向到 /dev/null
                    {
                        echo "20" # 開始安裝，進度 10%
                        sleep 1
                        pip install "$selected_packages" > /dev/null 2>&1
                        echo "60" # 安装完成，進度 90%
                        sleep 1
                        echo "90" # 安装完成，進度 90%
                        sleep 1
                    } | dialog --title "pip安裝" --gauge  "$selected  套件安裝中...." 10 30	
                    dialog --title "pip安裝完成!" --msgbox "$selected 套件安裝成功!" 10 30
                else
                    dialog --title "錯誤" --msgbox "沒選擇任何安裝!" 10 30
                fi
            }

            pip_update(){
                echo "0" > progress.txt
                {   
                    echo "10" 
                    sleep 0.5
                    echo "20"
                    sleep 0.5
                    echo "30"
                    python3 -m pip install --upgrade pip > /dev/null 2>&1
                    echo "60"
                    echo "90" 
                    sleep 1
                } | dialog --title "pip 更新進度" --gauge "正在更新..." 10 70 0
                
                # 顯示更新完成的消息
                dialog --title "更新完成" --msgbox "pip 更新完成!" 10 50
            }

            pip_install(){
                echo "0" > progress.txt
                {   
                    echo "10" 
                    sleep 1
                    echo "20"
                    sleep 0.5
                    echo "30"
                    sudo apt-get install python3-pip > /dev/null 2>&1
                    echo "60"
                    echo "90" 
                    sleep 0.5
                } | dialog --title "pip 安裝進度" --gauge "python3-pip 正在安裝..." 10 70 0
                # 顯示更新完成的消息
                dialog --title "安裝成功" --msgbox "pip安裝完成!" 10 30
            }

            # pip列表，格式為 "pip名稱" "描述"
            packages=(
                "pip" "pip安裝"
                "pip update" "更新pip套件"   
                "numpy" "安裝numpy"
                "python-dotenv" "安裝dotenv"
                "requests" "安裝requests"
                "Flask-JWT-Extended" "安裝Flask-JWT-Extended"
                "Flask" "安裝Flask"
                "Flask-RESTful" "安裝Flask-RESTful"
                "PyMySQL" "安裝PyMySQL"
                "Werkzeug" "安裝Werkzeug"
                "lask-apispec" "安裝lask-apispec"
                "marshmallow" "安裝marshmallow"
                "marshmallow-enum" "安裝marshmallow-enum"
                "beautifulsoup4" "安裝beautifulsoup4"
                "selenium" "安裝selenium"
                "scikit-learn" "安裝scikit-learn"
                "tensorflow" "安裝tensorflow"
                "python3-venv" "安裝虛擬環境venv"
                "openai" "安裝openai"
                "line-bot-sdk" "安裝line-bot-sdk"
            )

           while true; do
                # 構建選擇菜單
                selected=$(dialog --title "PIP 套件安裝更新" --menu "套件安裝清單:" 40 60 15 "${packages[@]}" 3>&1 1>&2 2>&3)

                # 調用函數安裝選中的安裝包
                if [[ "$selected" == "pip" ]]; then
                    pip_install
                elif [[ "$selected" == "pip update" ]]; then
                    pip_update
                elif [[ -n "$selected" ]]; then
                    # 检查软件包是否已经安装
                    if pip show "$selected" >/dev/null 2>&1; then
                        dialog --title "已安裝" --msgbox "$selected 已經安裝！" 10 50
                    else
                        install_packages "$selected"
                    fi
                else
                    break  # 如果沒有選中任何選項，則退出循環
                fi
            done
            ;;
        7)
            #輸入norok token
            authtoken=$(dialog --stdout --title "ngrok Authtoken" --inputbox "請輸入您的 ngrok authtoken:" 10 50)
            # 檢查是否输入了 authtoken
            if [ -n "$authtoken" ]; then
                # 添加 authtoken 到 ngrok 配置
                ngrok config add-authtoken "$authtoken"
                # 顯示成功消息
                dialog --title "完成!" --msgbox "ngrok Authtoken 添加成功" 10 50
                else
                # 顯示錯誤消息
                dialog --title "錯誤" --msgbox "ngrok Authtoken 取消輸入！" 10 50
            fi
            ;;
        8)
            #增加openapikey環境變數
            opai=$(dialog --stdout --title "OpenAPI key" --inputbox "請輸入您的 Openapikey:" 10 50)
            if [ -n "$opai" ]; then
                # 添加 OpenAPI key 到環境變數
                echo "export OPENAI_API_KEY=\"$opai\"" >> ~/.bashrc ; source ~/.bashrc
                # 成功消息
                dialog --title "完成!" --msgbox "$opai 添加成功\n  有bug需使用  source ~/.bashrc 重啟" 10 50
                (
                source ~/.bashrc
                )
            else
               # 錯誤消息
               dialog --title "錯誤" --msgbox "OpenAPI key 取消輸入！" 10 50
            fi
            ;;
        9)
            # 檢查是否安装了 htop
            if ! command -v /usr/bin/htop &> /dev/null; then
                # 如果未安装 htop
               dialog --title "錯誤" --msgbox "尚未安裝 htop！" 10 30
            else
                # 如果安装了 htop
                /usr/bin/htop   
            fi
            ;;
        10) 
            if ! command -v /usr/bin/cmatrix &> /dev/null; then
                # 如果未安装 htop
               dialog --title "錯誤" --msgbox "尚未安裝 cmatrix！" 10 30
            else
                # 如果安装了 htop
                /usr/bin/cmatrix  
            fi   
            ;;
        11) 
            # 用戶選擇  解除安裝程式
            # 定義一個函數，用於解除安裝選定的軟件包
            uninstall_packages() {
                selected_packages="$1"
                if [[ -n "$selected_packages" ]]; then
                    {
                        echo "10"
                        sleep 1
                        echo "30"
                        echo "$password" | sudo -S apt-get remove -y $selected_packages >/dev/null 2>&1
                        echo "50"
                        sleep 1
                        echo "90"
                        sleep 1
                    } | dialog --title "解除安裝進度" --gauge "$selected 正在解除安裝..." 10 70 0 
                    if [ $? -eq 0 ]; then
                        dialog --title "uninstallation Complete" --msgbox "$selected 解除完成安裝" 10 50 
                    else
                        dialog --title "解除安裝失敗" --msgbox "解除安裝 $selected_packages 失敗" 10 50 
                    fi
                else
                    dialog --title "錯誤" --msgbox "沒有選擇任何解除安裝!" 30 50 
                fi
            }

            # 安裝包列表，每行一個，格式為 "安裝包名稱" "描述"
            packages=(
                "apache2" "解除安裝 apache2"
                "net-tools" "解除安裝 net-tools"
                "openssh-server" "解除安裝 SSH"
                "tree" "解除安裝 tree"
                "curl" "解除安裝URL工具"
                "ngrok" "解除安裝 nogrok"
                "htop" "解除安裝 htop"
                "cmatrix" "解除安裝炫爆的螢幕保護程式"
                "mariadb-server" "解除安裝 Mariadb-server"
                "mariadb-client" "解除安裝 Mariadb-client"
            )

            while true; do
                # 構建選擇菜單
                selected=$(dialog --title "解除安裝程式選單" --menu "解除安裝程式清單:" 20 50 10 "${packages[@]}" 3>&1 1>&2 2>&3)
                # 如果用户選擇了返回，跳出循環返回上一頁
                if [[ -z "$selected" ]]; then
                    break
                # 如果用戶選擇了其他安裝包，則調用函數解除安裝選中的安裝包
                elif [[ -n "$selected" ]]; then
                    # 檢查是否安装
                    if dpkg-query -W -f='${Status}' "$selected" 2>/dev/null | grep -q "installed"; then
                        uninstall_packages "$selected"
                    else
                        dialog --title "錯誤" --msgbox "$selected 未安裝！" 10 50 
                    fi
                fi
            done
            ;;
        12)
            ngrokhttp=$(dialog --stdout --title "ngrok http port" --inputbox "請輸入http port:" 10 50)
            # 檢查是否输入了 http port
            if [ -n "$ngrokhttp" ]; then
                # 添加 http port 到 ngrok 配置
                ngrok http http://localhost:$ngrokhttp
            fi
            ;;        
        *)
            # 其他選擇或者用户取消選擇
            dialog --title "結束" --msgbox "你的信念決定未來成為什麼樣的人！" 10 30
            break # 退出while退出
            ;;
    esac
done
```



---

### 操作畫面說明
* Linux中新增使用者需要root權限，可以使用以下兩個方式執行 UPT.sh

1. sudo ./UPT.sh     
    #使用sudo執行 UPT.sh
2. sudo su           
     #使用sudo切換至root

![示範](https://hackmd.io/_uploads/BkoRGFxpa.png)


---

### 畫面(一):進入畫面
![進入畫面](https://hackmd.io/_uploads/S1tBQtxaa.png)


---

### 畫面(二):主頁面選單模式
![主頁面選單模式](https://hackmd.io/_uploads/ByNomKx66.png)


---

### 畫面(三):網卡訊息,顯示ifconfig資訊
![網卡訊息](https://hackmd.io/_uploads/HJ8l4Fxap.png)


---

### 畫面(四):顯示目前Port資訊,可依需求修改
![port](https://hackmd.io/_uploads/r1pO4Yg6T.png)


---

### 畫面(五):時區設置
![時區設置](https://hackmd.io/_uploads/B1OKBtlT6.png)

![時區設置2](https://hackmd.io/_uploads/B1nFHYxap.png)


---

### 畫面(六):常用程式安裝,可依需求增加
![安裝選單](https://hackmd.io/_uploads/HyLCLKxaT.png)
安裝中進度條
![安裝中](https://hackmd.io/_uploads/rJxyvKe66.png)
安裝完成後會顯示完成
![安裝完成](https://hackmd.io/_uploads/SJVJPKgap.png)
安裝過的程式會提醒已安裝
![已安裝](https://hackmd.io/_uploads/rk0SDtlTa.png)


---

### 畫面(七):常用python套件安裝,可依需求增加
![pip安裝套件選單](https://hackmd.io/_uploads/Skq8tYl66.png)
pip安裝中進度條
![pip安裝中](https://hackmd.io/_uploads/H1jm5tg6T.png)
pip安裝完成提醒
![pip安裝完成](https://hackmd.io/_uploads/By7O9FeT6.png)
安裝過pip套件會顯示已安裝
![pip已安裝](https://hackmd.io/_uploads/rk15FFep6.png)


---

### 畫面(八):Ngrok token輸入
![norok 輸入](https://hackmd.io/_uploads/SyQGiYx6p.png)

![輸入完成](https://hackmd.io/_uploads/BJYXsFlTa.png)


---

### 畫面(九):OpenAPI key 輸入
![OPenAPIkey](https://hackmd.io/_uploads/BkydBcxpp.png)

![OPI添加成功](https://hackmd.io/_uploads/HynjmAe6p.png)


1. 輸入完後須輸入指令重啟.bashrc
```
source ~/.bashrc
```
2. 並輸入查看指令有沒有設置成功
```
echo $OPENAI_API_KEY
```
![螢幕擷取畫面 2024-03-02 200759](https://hackmd.io/_uploads/HydnI9e6p.png)


---

### 畫面(十):htop 系統訊息
**如果尚未安裝htop會顯示未安裝,需要回程式安裝選單安裝**
![htop位安裝](https://hackmd.io/_uploads/HkvsDqxpT.png)
![螢2 201403](https://hackmd.io/_uploads/B19mOqx6p.png)

![htop執行](https://hackmd.io/_uploads/HkgYd5lp6.png)
* F10退出htop會返回選單畫面

---

### 畫面(十一):螢幕保護程式cmatrix
**如果尚未安裝cmatrix會顯示未安裝,需要回程式安裝選單安裝**
![螢保衛裝](https://hackmd.io/_uploads/S1Wnt5gaa.png)

![瑩寶啟動](https://hackmd.io/_uploads/HyFM5cxap.png)

* Ctrl + C 退出 cmatrix 會返回選單畫面


---

### 畫面(十一):解除程式安裝,可依需求增加
解除安裝選單
![解除安裝](https://hackmd.io/_uploads/BkHgs5gTT.png)
我們來嘗試解除安裝cmatrix螢幕保護程式
![解除安裝中](https://hackmd.io/_uploads/r1x6gsce66.png)
解除安裝後會顯示完成
![解除安裝完成](https://hackmd.io/_uploads/rk77iceTp.png)
解除安裝後再重複選會顯示錯誤
![解除安裝未安裝](https://hackmd.io/_uploads/Hy5Hsqepa.png)


---

### 畫面(十二):ngrok http port輸入
安裝ngrok後輸入port就能外把界的請求轉發到你指定的Port
![4567](https://hackmd.io/_uploads/BJkLa5e66.png)

![nonononon](https://hackmd.io/_uploads/r1HZZjxT6.png)

* Ctrl + C 退出 ngrok 會返回選單畫面


---
### 結束畫面放激勵語錄 勉勵自己繼續努力
![結束畫面](https://hackmd.io/_uploads/S10w-slap.png)


---
## 結束 謝謝