如何通过GIT_SSH_COMMAND按当前目录切换SSH密钥?
排查GIT_SSH_COMMAND脚本无法正确选择SSH密钥的问题
核心问题
你写的git-ssh.sh脚本没有转发Git传递给SSH的必要参数,这是导致ssh抛出用法错误的直接原因。Git在调用自定义SSH命令时,会自动传递目标地址(比如git@github.com)和后续的Git操作命令,你的脚本只执行了带密钥的ssh命令,但没把这些参数传过去,导致ssh因为缺少必填参数报错。
修复与排查步骤
- 补全脚本的参数转发
修改~/git-ssh.sh,在ssh命令末尾加上"$@",把Git传递的所有参数原封不动转发给ssh:
#!/bin/bash dir=$(pwd) if [[ $dir == *"work"* ]]; then ssh -i ~/.ssh/key_work -o IdentitiesOnly=yes "$@" elif [[ $dir == *"personal"* ]]; then ssh -i ~/.ssh/key_personal -o IdentitiesOnly=yes "$@" else exit 1 fi
- 给脚本添加可执行权限
执行以下命令确保脚本能被shell运行:
chmod +x ~/git-ssh.sh
- 验证脚本逻辑与连接
- 在
~/git/work目录下手动执行~/git-ssh.sh git@github.com,如果能看到类似PTY allocation request failed on channel 0的提示后退出,说明密钥和连接逻辑正常;如果提示权限问题,检查密钥的权限(密钥文件权限应为600,目录~/.ssh应为700)。 - 若需要精确匹配目录前缀(避免误匹配其他含work/personal的路径),可以把目录判断改成:
if [[ $dir == "$HOME/git/work"* ]]; then
- 修正.zshrc里的路径配置
建议用绝对路径定义GIT_SSH_COMMAND,避免shell路径解析问题:
export GIT_SSH_COMMAND="$HOME/git-ssh.sh"
修改后执行source ~/.zshrc让配置生效。
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

