如何复用SSH_AUTH_SOCK单连接执行远程命令,避免重复输入动态令牌
复用SSH连接避免重复输入动态令牌的方案
SSH原生ControlMaster方案(推荐)
这是SSH内置的连接复用功能,无需额外工具,配置后自动生效:
- 先创建socket存储目录(如果不存在):
mkdir -p ~/.ssh/sockets - 编辑本地
~/.ssh/config,添加workserver1的配置段:
参数说明:Host workserver1.com HostName workserver1.com ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h-%p.sock ControlPersist 1hControlMaster auto:自动检测并复用已有的控制连接,无则创建新连接ControlPath:指定连接socket的存储路径,%r为远程用户名、%h为主机名、%p为端口,确保每个连接的socket唯一ControlPersist 1h:主连接在最后一次复用操作后保持1小时,超时自动关闭(可改为forever永久保持,或30m等自定义时长)
- 使用步骤:
- 首次执行
ssh workserver1.com,输入一次动态令牌完成登录,此时会生成对应的控制socket - 后续无论是新开终端交互式登录,还是执行远程命令(如
ssh workserver1.com 'top'、scp file.txt workserver1.com:/tmp/),都会自动复用已有连接,无需重复输入令牌 - 主动关闭主连接:执行
ssh -O exit workserver1.com
- 首次执行
Socat手动复用方案(备选)
如果不想修改SSH配置,可通过socat手动绑定本地socket实现复用:
- 第一步建立持久SSH连接并绑定socket:
命令说明:socat UNIX-LISTEN:/tmp/ssh-workserver.sock,fork EXEC:"ssh workserver1.com -tt",pty,stderrUNIX-LISTEN:/tmp/ssh-workserver.sock,fork:在本地创建UNIX socket,fork参数允许同时处理多个复用连接EXEC:"ssh workserver1.com -tt":启动SSH连接,-tt强制分配伪终端,支持交互式操作和命令执行
- 后续复用连接时,通过socat连接本地socket:
socat UNIX-CONNECT:/tmp/ssh-workserver.sock STDIO - 注意:需保持第一个socat进程运行,关闭该进程会断开所有复用的连接
内容的提问来源于stack exchange,提问作者Jia
相关产品推荐
相关产品推荐

