企业代理环境下如何为GIT_SSH_COMMAND配置多条执行命令
解答
错误原因分析
- 首次语法报错是因为
&是shell后台运行的命令结束符,不需要额外加多余分号,你写的&;;属于非法语法。 - 修改后的新报错有两个根源:
- shell中设置环境变量不需要加
set前缀,set PROXY_USER=xxx是错误写法,会导致后续ssh把参数解析为主机名,触发域名解析失败报错。 - desproxy后台启动后需要时间完成端口监听,直接执行ssh会遇到端口未就绪的问题;多次运行还会因为2222端口被已有进程占用,触发绑定失败报错。
- shell中设置环境变量不需要加
正确配置方案
临时直接写在GIT_SSH_COMMAND的写法
注意去掉set,加短延迟等待端口就绪:
export GIT_SSH_COMMAND="PROXY_USER=$proxy_user:$proxy_pw desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 >/dev/null 2>&1 & sleep 0.2; ssh"
如果写入git全局配置,需要转义分号:
[core] sshCommand = PROXY_USER=$proxy_user:$proxy_pw desproxy ssh.github.com 443 $proxy_host $proxy_port 2222 >/dev/null 2>&1 & sleep 0.2\; ssh
更稳定的封装脚本方案
上述直接写命令的方案会导致每次执行git操作都启动新的desproxy进程,容易残留进程、端口冲突,更推荐封装为独立脚本:
- 新建脚本文件
~/bin/git-ssh-proxy-wrapper,写入以下内容:
#!/bin/bash # 检查2222端口是否已被监听,避免重复启动desproxy if ! nc -z 127.0.0.1 2222; then PROXY_USER="$proxy_user:$proxy_pw" desproxy ssh.github.com 443 "$proxy_host" "$proxy_port" 2222 >/dev/null 2>&1 & # 等待端口就绪再执行ssh until nc -z 127.0.0.1 2222; do sleep 0.1; done fi exec ssh "$@"
- 给脚本添加执行权限:
chmod +x ~/bin/git-ssh-proxy-wrapper
- 配置git使用该脚本作为ssh命令:
git config --global core.sshCommand ~/bin/git-ssh-proxy-wrapper
内容的提问来源于stack exchange,提问作者murchu27
相关产品推荐
相关产品推荐

