You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloud Foundry环境下,如何用脚本实现SSH隧道+新Shell执行数据库命令

自动化Cloud Foundry SSH隧道并连接MariaDB

不管用Bash还是Python,核心都是先后台拉起SSH隧道,等隧道就绪后打开新终端执行mysql命令,最后确保隧道能正常关闭。下面是两种具体实现:

Bash 脚本方案

注意:先把脚本里的<IP ADDRESS OF THE DB>、YOUR-HOST-APP、<username>、<DB>换成你自己的实际值

#!/bin/bash

# 配置参数(替换为你的实际信息)
DB_IP="<IP ADDRESS OF THE DB>"
HOST_APP="YOUR-HOST-APP"
DB_USER="<username>"
DB_NAME="<DB>"
LOCAL_PORT=63306

# 后台启动SSH隧道,日志临时存到/tmp目录
cf ssh -L ${LOCAL_PORT}:${DB_IP}:3306 ${HOST_APP} > /tmp/cf_ssh_tunnel.log 2>&1 &
SSH_PID=$!

# 等待5秒让隧道完全建立(网络慢的话可以调长等待时间)
sleep 5

# 检查SSH进程是否正常运行
if ps -p $SSH_PID > /dev/null; then
    # 根据系统自动识别终端程序,打开新窗口执行mysql命令
    if command -v xterm > /dev/null; then
        xterm -e "mysql -u ${DB_USER} -h 0 -p -D ${DB_NAME} -P ${LOCAL_PORT}; exec bash" &
    elif command -v gnome-terminal > /dev/null; then
        gnome-terminal -- bash -c "mysql -u ${DB_USER} -h 0 -p -D ${DB_NAME} -P ${LOCAL_PORT}; exec bash" &
    elif command -v iTerm2 > /dev/null; then
        osascript -e 'tell application "iTerm2" to create window with default profile command "mysql -u '"${DB_USER}"' -h 0 -p -D '"${DB_NAME}"' -P '"${LOCAL_PORT}"'; exec bash"'
    else
        echo "未找到可用的终端程序,请手动执行:mysql -u ${DB_USER} -h 0 -p -D ${DB_NAME} -P ${LOCAL_PORT}"
    fi

    # 等待mysql窗口关闭后,自动终止SSH隧道进程
    wait %2
    kill $SSH_PID
else
    echo "SSH隧道建立失败,查看日志:/tmp/cf_ssh_tunnel.log"
    exit 1
fi

用法

  1. 将脚本保存为cf_mysql_auto.sh
  2. 赋予执行权限:chmod +x cf_mysql_auto.sh
  3. 直接运行:./cf_mysql_auto.sh

Python 脚本方案

同样记得替换脚本里的占位参数为实际值

import subprocess
import time
import sys

# 配置参数(替换为你的实际信息)
DB_IP = "<IP ADDRESS OF THE DB>"
HOST_APP = "YOUR-HOST-APP"
DB_USER = "<username>"
DB_NAME = "<DB>"
LOCAL_PORT = 63306

# 后台启动SSH隧道进程
ssh_cmd = ["cf", "ssh", "-L", f"{LOCAL_PORT}:{DB_IP}:3306", HOST_APP]
ssh_process = subprocess.Popen(ssh_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 等待隧道建立(可根据网络情况调整等待时间)
time.sleep(5)

# 检查隧道进程是否正常运行
if ssh_process.poll() is None:
    mysql_cmd = f"mysql -u {DB_USER} -h 0 -p -D {DB_NAME} -P {LOCAL_PORT}; exec bash"
    
    # 根据操作系统自动打开终端执行mysql命令
    if sys.platform == "linux":
        # 优先尝试gnome-terminal,失败则用xterm
        try:
            subprocess.Popen(["gnome-terminal", "--", "bash", "-c", mysql_cmd])
        except FileNotFoundError:
            try:
                subprocess.Popen(["xterm", "-e", mysql_cmd])
            except FileNotFoundError:
                print("找不到可用终端,手动执行命令:", mysql_cmd)
    elif sys.platform == "darwin":
        # macOS优先用iTerm2,失败则用系统Terminal
        try:
            subprocess.run([
                "osascript", "-e",
                f'tell application "iTerm2" to create window with default profile command "{mysql_cmd}"'
            ])
        except FileNotFoundError:
            subprocess.run([
                "osascript", "-e",
                f'tell application "Terminal" to do script "{mysql_cmd}"'
            ])
    else:
        print("当前系统不支持自动打开终端,手动执行命令:", mysql_cmd)
    
    # 按下回车键后关闭SSH隧道
    input("使用完成后按回车键关闭SSH隧道...")
    ssh_process.terminate()
    ssh_process.wait()
else:
    stdout, stderr = ssh_process.communicate()
    print("SSH隧道建立失败:")
    print("输出信息:", stdout.decode())
    print("错误信息:", stderr.decode())
    sys.exit(1)

用法

  1. 将脚本保存为cf_mysql_auto.py
  2. 直接运行:python3 cf_mysql_auto.py

内容的提问来源于stack exchange,提问作者Ciro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:22:07