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
用法
- 将脚本保存为
cf_mysql_auto.sh - 赋予执行权限:
chmod +x cf_mysql_auto.sh - 直接运行:
./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)
用法
- 将脚本保存为
cf_mysql_auto.py - 直接运行:
python3 cf_mysql_auto.py
内容的提问来源于stack exchange,提问作者Ciro
相关产品推荐
相关产品推荐

