Linux 上 SecureCRT 自动化部署实践
一 方案总览与适用场景
二 快速落地步骤
#!/usr/bin/env bash
set -e
APP_DIR=/opt/myapp
BACKUP_DIR=/opt/backup/$(date +%F_%H-%M-%S)
mkdir -p "$BACKUP_DIR"
# 备份
[ -d "$APP_DIR/current" ] && cp -a "$APP_DIR/current" "$BACKUP_DIR"
# 拉取与部署
cd "$APP_DIR/releases" && git pull
ln -sfn "$(pwd)/$(git rev-parse --short HEAD)" "$APP_DIR/current"
# 重启服务
sudo systemctl restart myapp || { echo "服务重启失败"; exit 1; }
# 健康检查
for i in {1..30}; do
curl -fs http://127.0.0.1:8080/health && { echo "OK"; exit 0; }
sleep 2
done
echo "健康检查失败"; exit 1
chmod +x deploy.shchmod +x /opt/myapp/deploy.sh
/opt/myapp/deploy.sh
sleep 2;。保存后重连即可自动跑脚本。三 脚本示例与关键 API
cd /opt/myapp && nohup ./deploy.sh >deploy.log 2>&1 &
# $language = "Python"
# $interface = "1.0"
import os, time, re
from datetime import datetime
sessions = ["app-prod-01", "app-prod-02"]
log_dir = os.path.expanduser("~/securecrt_logs")
os.makedirs(log_dir, exist_ok=True)
def log(s, host=None):
ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
msg = f"[{ts}] {host}: {s}" if host else s
print(msg)
with open(os.path.join(log_dir, "batch.log"), "a") as f:
f.write(msg + "\n")
def wait_for_prompt(crt, prompt, timeout=30):
idx, match, elapsed = crt.Screen.WaitForStrings([prompt, "#", "$", ">"], timeout)
return idx, match
for s in sessions:
try:
crt.Session.Connect(f"/S {s}")
screen = crt.Screen
screen.Synchronous = True
# 等待登录提示并自动输入(若未启用自动登录)
# idx, _ = wait_for_prompt(crt, "login:")
# if idx == 0: screen.Send("myuser\r")
# 执行部署
cmd = f"cd /opt/myapp && bash deploy.sh 2>&1; echo 'DEPLOY_EXIT=$?'\r"
screen.Send(cmd)
idx, _ = wait_for_prompt(crt, "DEPLOY_EXIT=", 300)
screen.Send("\r")
_, out = wait_for_prompt(crt, "#", 10)
log(out.strip(), s)
# 根据退出码做判断
if "DEPLOY_EXIT=0" in out:
log("部署成功", s)
else:
log("部署失败", s)
except Exception as e:
log(f"异常: {e}", s)
finally:
if crt.Session.Connected:
crt.Session.Disconnect()
time.sleep(1)
四 批量与调度
SecureCRT /S "session-name" /SCRIPT myscript.py),实现定时或事件触发的自动化部署。五 安全与最佳实践
>> deploy.log 2>&1),便于审计与回溯。BACKUP_DIR)。