如何正确且便捷地关闭SSH隧道?
如何正确且便捷地关闭SSH隧道?
嘿,我太懂你这种每次要查进程杀进程的麻烦了!其实你之前用Ctrl+Z是踩了个小坑——那只是把SSH进程挂到后台暂停了,并没有真正终止,所以端口才会一直被占着。给你几个更顺畅的解决方法:
最直接的正确终止方式:别用Ctrl+Z,改用Ctrl+C
当你在前台运行SSH隧道命令时,直接按下Ctrl+C就能让SSH正常退出,它会自动释放占用的12345端口,根本不用后续的kill操作。这是最省心的基础操作,下次别再用Ctrl+Z啦~如果已经不小心用了Ctrl+Z,不用急着查进程号
你可以先输入fg命令,把刚才挂起的SSH进程调回前台,然后再按Ctrl+C就能正常终止它了,比你之前用lsof查进程再kill要省事不少。后台运行隧道,还能优雅关闭的进阶玩法
要是你希望隧道在后台运行,又不想每次都找进程,那可以用SSH的控制套接字功能:
启动隧道的时候加上-M -S参数指定一个套接字文件,比如:ssh -f -N -L 12345:some-database.rds.amazonaws.com:5432 admin@bastion.company.com -S ~/.ssh/aws_db_tunnel.sock这里
-f是让SSH后台运行,-S指定了套接字文件的位置。之后要关闭隧道的时候,只需要执行:ssh -S ~/.ssh/aws_db_tunnel.sock -O exit admin@bastion.company.com这样就能优雅地让SSH隧道正常关闭,端口也会立刻释放,完全不用手动杀进程。
用会话管理工具(适合长期运行场景)
如果你经常需要开着隧道,偶尔切换使用,那可以用screen或者tmux这类会话工具:- 先启动一个screen会话:
screen -S db_tunnel - 在会话里运行你的SSH隧道命令
- 按
Ctrl+A+D把会话放到后台 - 之后想要关闭隧道的时候,输入
screen -r db_tunnel回到会话,按Ctrl+C终止隧道,再输入exit关闭会话就行。
这种方法的好处是你还能随时查看隧道的运行状态,不怕不小心关掉终端导致隧道中断。
- 先启动一个screen会话:
备注:内容来源于stack exchange,提问作者Mike Christensen




