---
# System prepended metadata

title: Tomcat 使用 sh 升級

---

Tomcat 使用 sh 腳本升級



雖然手動升級也不慢，但是手上的 java 專案越來越多，tomcat 版本每一段時間就會被抓出漏洞，一定要升級，為了要無痛升級，寫了個 sh

```
#!/bin/bash

# 設定好 tomcat 版本號宇下載的連結
TOMCAT_VERSION="9.0.80"
TOMCAT_DOWNLOAD_URL="https://downloads.apache.org/tomcat/tomcat-9/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.zip"

# 備份原本的 tomcat 資料夾到使用者桌面
BACKUP_DIR="${HOME}/Desktop/tomcat_backup"
# tomcat 安裝資料路徑
TOMCAT_DIR="/opt/tomcat"

if [ -d "$TOMCAT_DIR" ]; then
  echo "備份原本的 tomcat 資料夾到 ${BACKUP_DIR}"
  mkdir -p "$BACKUP_DIR"
  cp -r "$TOMCAT_DIR"/* "$BACKUP_DIR"
fi

# 下載並解壓縮指定的 tomcat
echo "下載並解壓縮指定的 tomcat ${TOMCAT_VERSION}"
TMP_DIR=$(mktemp -d)
wget "$TOMCAT_DOWNLOAD_URL" -O "${TMP_DIR}/tomcat.zip"
unzip -q "${TMP_DIR}/tomcat.zip" -d "${TMP_DIR}"

# 停止服務，並刪除原本的 tomcat 
echo "停止服務，並刪除原本的 tomcat "
sudo systemctl stop tomcat
sudo rm -rf "$TOMCAT_DIR"

# 將 tomcat 移動到 opt 資料夾
echo "將 tomcat 移動到 ${TOMCAT_DIR}"
sudo mv "${TMP_DIR}/apache-tomcat-${TOMCAT_VERSION}" "$TOMCAT_DIR"

# 複製 war 檔到 webapps 資料夾
echo "複製 war 檔到 webapps 資料夾"
WAR_FILES_DIR="${BACKUP_DIR}/webapps"
if [ -d "$WAR_FILES_DIR" ]; then
  cp "$WAR_FILES_DIR"/*.war "${TOMCAT_DIR}/webapps/"
fi

# 修改server.xml中的HTTP port 為 80
echo "修改server.xml中的HTTP port 為 80"
sudo sed -i 's/8080/80/g' "${TOMCAT_DIR}/conf/server.xml"

# 在 web.xml 中註解指定的部分
sed -i '/<welcome-file-list>/,/<\/welcome-file-list>/ s/^/<!--/' /opt/tomcat/conf/web.xml
sed -i '/<welcome-file-list>/,/<\/welcome-file-list>/ s/$/-->/' /opt/tomcat/conf/web.xml



# 設定 tomcat 資料夾所有權與權限
echo "設定 tomcat 資料夾所有權與權限"
sudo chown -R tomcat:tomcat "$TOMCAT_DIR"
sudo chmod -R 770 "${TOMCAT_DIR}/work" "${TOMCAT_DIR}/conf" "${TOMCAT_DIR}/webapps" "${TOMCAT_DIR}/logs"
sudo chmod +x "${TOMCAT_DIR}/bin/startup.sh" "${TOMCAT_DIR}/bin/shutdown.sh" "${TOMCAT_DIR}/bin/catalina.sh"

# 增加一旦出現 Error， Tomcat 版本號也不會出現的設定
if [ ! -f "${TOMCAT_DIR}/lib/org/apache/catalina/util/ServerInfo.properties" ]; then
	sudo -u tomcat mkdir -p "${TOMCAT_DIR}/lib/org/apache/catalina/util"
	echo 'server.info=Apache Tomcat' | sudo -u tomcat tee "${TOMCAT_DIR}/lib/org/apache/catalina/util/ServerInfo.properties" > /dev/null
    echo "ServerInfo.properties created."
else
    echo "ServerInfo.properties already exists."
fi

# 啟動安裝好的 tomcat
echo "啟動安裝好的 tomcat"
#"${TOMCAT_DIR}/bin/startup.sh"
sudo systemctl start tomcat

# 清理臨時資料夾
rm -rf "$TMP_DIR"

echo "Tomcat 升級完成！"
```

我將以上內容，存在 ~/Desktop/upgrade_tomcat.sh

為了能成功執行，要將該檔案的權限設定為可執行。
```
sudo chmod +x upgrade_tomcat.sh
```

接著就是執行該檔案了
```
sh upgrade_tomcat.sh
```

沒意外的話，會顯示以下訊息

```
備份原本的 tomcat 資料夾到 /home/vm/center61/Desktop/tomcat_backup
下載並解壓縮指定的 tomcat 9.0.80
--2023-09-06 11:54:24--  https://downloads.apache.org/tomcat/tomcat-9/v9.0.80/bin/apache-tomcat-9.0.80.zip
正在查找主機 downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104, 2a01:4f9:3a:2c57::2, ...
正在連接 downloads.apache.org (downloads.apache.org)|88.99.95.219|:443... 連上了。
已送出 HTTP 要求，正在等候回應... 200 OK
長度: 12236278 (12M) [application/zip]
Saving to: ‘/tmp/tmp.UDB0uVbzzO/tomcat.zip’

100%[==================================================================================================>] 12,236,278  4.47MB/s   in 2.6s

2023-09-06 11:54:28 (4.47 MB/s) - ‘/tmp/tmp.UDB0uVbzzO/tomcat.zip’ saved [12236278/12236278]

停止服務，並刪除原本的 tomcat
將 tomcat 移動到 /opt/tomcat
複製 war 檔到 webapps 資料夾
修改server.xml中的HTTP port 為 80
設定 tomcat 資料夾所有權與權限
啟動安裝好的 tomcat
Tomcat 升級完成！

```

如果有錯誤訊息，就要想辦法處理囉，以上。