# 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

---
### 畫面(一):進入畫面

---
### 畫面(二):主頁面選單模式

---
### 畫面(三):網卡訊息,顯示ifconfig資訊

---
### 畫面(四):顯示目前Port資訊,可依需求修改

---
### 畫面(五):時區設置


---
### 畫面(六):常用程式安裝,可依需求增加

安裝中進度條

安裝完成後會顯示完成

安裝過的程式會提醒已安裝

---
### 畫面(七):常用python套件安裝,可依需求增加

pip安裝中進度條

pip安裝完成提醒

安裝過pip套件會顯示已安裝

---
### 畫面(八):Ngrok token輸入


---
### 畫面(九):OpenAPI key 輸入


1. 輸入完後須輸入指令重啟.bashrc
```
source ~/.bashrc
```
2. 並輸入查看指令有沒有設置成功
```
echo $OPENAI_API_KEY
```

---
### 畫面(十):htop 系統訊息
**如果尚未安裝htop會顯示未安裝,需要回程式安裝選單安裝**



* F10退出htop會返回選單畫面
---
### 畫面(十一):螢幕保護程式cmatrix
**如果尚未安裝cmatrix會顯示未安裝,需要回程式安裝選單安裝**


* Ctrl + C 退出 cmatrix 會返回選單畫面
---
### 畫面(十一):解除程式安裝,可依需求增加
解除安裝選單

我們來嘗試解除安裝cmatrix螢幕保護程式

解除安裝後會顯示完成

解除安裝後再重複選會顯示錯誤

---
### 畫面(十二):ngrok http port輸入
安裝ngrok後輸入port就能外把界的請求轉發到你指定的Port


* Ctrl + C 退出 ngrok 會返回選單畫面
---
### 結束畫面放激勵語錄 勉勵自己繼續努力

---
## 結束 謝謝