Git Bash 启动时 ssh-agent 多次尝试启动但失败

目录

  • 一、遇到的问题
  • 二、核心原因
  • 三、解决方案步骤
    • [1. 找到并修改自动启动 ssh-agent 的脚本](#1. 找到并修改自动启动 ssh-agent 的脚本)
    • [2. 修改启动脚本调用正确路径(失败)](#2. 修改启动脚本调用正确路径(失败))
    • [3. 注释掉重复启动代码(成功)](#3. 注释掉重复启动代码(成功))
    • [4. 检查 ssh-agent 是否存在且在 PATH 中](#4. 检查 ssh-agent 是否存在且在 PATH 中)
    • [5. 重新安装 Git for Windows](#5. 重新安装 Git for Windows)
    • [6. 临时方案:使用 Windows 内置 ssh-agent](#6. 临时方案:使用 Windows 内置 ssh-agent)
  • 四、总结
  • [五、适合 Git Bash 的 .bashrc 模板(重要)](#五、适合 Git Bash 的 .bashrc 模板(重要))
    • [1. 完整的 .bashrc 模板](#1. 完整的 .bashrc 模板)
    • [2. 改进的 .bashrc 模板](#2. 改进的 .bashrc 模板)
    • [3. 使用步骤](#3. 使用步骤)
    • [4. Bad address 报错(中文路径导致的异常)](#4. Bad address 报错(中文路径导致的异常))

一、遇到的问题

打开 Git Bash 出现如下图所示报错,按下 Ctrl + C 停止运行。

问题分析:Git Bash 启动时 ssh-agent 多次尝试启动但失败,报错提示 /usr/bin/ssh-agent 文件找不到或无法执行。

bash 复制代码
Agent pid 1289
bash: /usr/bin/ssh-agent: cannot execute: required file not found
bash: /usr/bin/ssh-agent: Bad address
bash: /usr/bin/ssh-agent: Bad address
Agent pid 1294
Agent pid 1296
... ...

二、核心原因

  • Git Bash 配置或环境中某处自动调用了 /usr/bin/ssh-agent ,但该文件不存在或损坏。

  • 可能在之前修改过启动脚本(如 .bashrc 或 .bash_profile 或 /etc/profile)里调用了 ssh-agent ,固定了 /usr/bin/ssh-agent 路径,而当前 Git 安装中 ssh-agent 的路径并不是这个。

  • 每次开 shell 都会重复启动 ssh-agent ,产生 "Agent pid ..." 多个进程。

三、解决方案步骤

1. 找到并修改自动启动 ssh-agent 的脚本

打开 Git Bash ,输入以下命令查看哪些配置文件里启动了 ssh-agent :

bash 复制代码
grep -n ssh-agent ~/.bashrc ~/.bash_profile ~/.profile /etc/profile /etc/bash.bashrc 2>/dev/null

重点检查用户主目录(即 C:/Users/<用户名>)下的:~/.bashrc~/.bash_profile~/.profile 文件,或者 Git Bash 安装目录下的全局配置 /etc/profile 文件。

可以看出我的 ~/.bashrc 文件的第 6 行存在 "eval $(ssh-agent -s)" 语句。

你会找到类似调用:eval $(ssh-agent -s) 或者 ssh-agent ,且路径可能写成了:/usr/bin/ssh-agent ,如果写了绝对路径 /usr/bin/ssh-agent ,但该路径不存在或 ssh-agent 文件不完整,bash 就会报错。

2. 修改启动脚本调用正确路径(失败)

利用 where ssh-agent 找到 Git 正确的 ssh-agent 路径。

  • 直接改成不带路径的 ssh-agent ,让系统自动查找路径:eval $(ssh-agent -s)

  • 或者改成 Git 正确的 ssh-agent 路径,比如:eval $("D:/Git/usr/bin/ssh-agent.exe" -s) 。注意路径需用双引号,且使用 Windows 风格路径或 Cygwin 路径转换。

3. 注释掉重复启动代码(成功)

如果启动脚本里多次调用了 ssh-agent ,会导致多次出现 Agent pid ,可以暂时注释掉启动代码,测试是否还会报错。

  • 打开 ~/.bashrc :nano ~/.bashrc ,找到涉及 ssh-agent 的行,加 # 注释掉。
bash 复制代码
# eval $(ssh-agent -s)

Nano 编辑器保存与退出:编辑完后使用 Ctrl + X 快捷键退出,会弹出 "Save modified buffer?" ,输入 "y" ,最后按一下 Enter 键即可退出。

  • 保存并重新打开 Git Bash ,确认是否不再有报错。

4. 检查 ssh-agent 是否存在且在 PATH 中

先确认 Git Bash 中有没有 ssh-agent 。

  • 执行命令 which ssh-agent ,如果没有返回路径说明没有 ssh-agent 。

  • 或者执行以下命令确认文件是否存在。

bash 复制代码
ls /usr/bin/ssh-agent
ls /mingw64/bin/ssh-agent.exe

5. 重新安装 Git for Windows

如果 ssh-agent 文件确实缺失或损坏,建议:

  • 卸载当前 Git

  • https://git-scm.com 下载最新版本

  • 重新安装,选择默认选项确保包含 ssh-agent

6. 临时方案:使用 Windows 内置 ssh-agent

Windows 10/11 默认自带 ssh-agent ,可以启用,避免 Git Bash 启动 ssh-agent ,方法为在 PowerShell(管理员)执行以下命令:

powershell 复制代码
Start-Service ssh-agent  
Set-Service -StartupType Automatic ssh-agent  

然后 Git Bash 里面就不用每次启动 ssh-agent 了。

四、总结

  • 找到自动调用 ssh-agent 的启动脚本,检查是否写死了错误路径 /usr/bin/ssh-agent 。

  • 注释掉多余的 ssh-agent 启动命令,避免多次启动。

  • 确认 ssh-agent 是否存在于 Git 的路径里。

  • 重新安装 Git 确保文件完整。

  • 或用 Windows 自带的 ssh-agent 替代。

五、适合 Git Bash 的 .bashrc 模板(重要)

我原先的 ~/.bashrc 内容是:

bash 复制代码
if [ -f ~/.bash_profile ]; then  
    . ~/.bash_profile  
fi  

# Start SSH agent  
eval $(ssh-agent -s)  

因此启动 Git Bash 时出现了错误,关键的原因在于 eval $(ssh-agent -s) 调用了找不到的 ssh-agent ,还会重复启动导致多个 Agent pid ,因此需要改写这个脚本,以达到以下几个要求:

  • 只启动一个 ssh-agent 实例。

  • 使用系统默认的 ssh-agent ,避免硬编码路径。

  • 避免重复启动。

1. 完整的 .bashrc 模板

用户名非中文时可使用该模板,若路径中含有中文字符,会导致 Git Bash 或相关工具在处理文件路径时出现异常。

以下是一个功能完善的 .bashrc 模板,适合 Git Bash 使用,包含:

  • 交互式判断

  • 基础环境配置(编辑器,命令提示符,别名,颜色支持)

  • 自动启动 ssh-agent 并自动添加默认私钥

  • 便于扩展和维护的结构

bash 复制代码
# ~/.bashrc - 适合 Windows Git Bash 的 ssh-agent 完整配置示例(含常用配置)  

# 只在交互式 shell 生效  
[[ $- != *i* ]] && return

# ---- 基础环境 ---- 

# 设置默认编辑器  
export EDITOR=nano  # 可改为 vim、code、emacs 等  

# 设置命令提示符,显示用户名@主机名:当前路径$  
PS1='\u@\h:\w\$ '  

# 启用颜色支持(Linux 默认有,Git Bash 也支持)  
if command -v dircolors >/dev/null 2>&1; then  
  if [ -r ~/.dircolors ]; then  
    eval "$(dircolors -b ~/.dircolors)"  
  else  
    eval "$(dircolors -b)"  
  fi
  # 启用彩色 ls 和 grep 
  alias ls='ls --color=auto'  
  alias grep='grep --color=auto'  
fi   

# 常用别名  
alias ll='ls -alF'  
alias la='ls -A'  
alias l='ls -CF'  

# 加载自定义的环境变量文件(如果存在)  
[ -f ~/.bash_aliases ] && source ~/.bash_aliases

# ---- ssh-agent 自动启动配置 ----  

# 会在 ~/.ssh 路径下生成一个 ssh-agent-environment 文件
# 使用一个固定的环境变量文件存储 ssh-agent 环境变量,让后续终端会话自动复用,确保 ssh-agent 会话持久
SSH_ENV="$HOME/.ssh/ssh-agent-environment"  

start_agent() {  
  echo "启动 SSH 代理..."
  # 启动 ssh-agent 并保存环境变量
  /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"  
  chmod 600 "${SSH_ENV}"  
  source "${SSH_ENV}" > /dev/null  
  # 自动添加默认私钥【请根据实际密钥名称自行修改】
  if [ -f "$HOME/.ssh/id_rsa" ]; then  
    ssh-add "$HOME/.ssh/id_rsa"  
  elif [ -f "$HOME/.ssh/id_ed25519" ]; then  
    ssh-add "$HOME/.ssh/id_ed25519"  
  fi  
}  

# 载入 ssh-agent 环境变量(如果文件存在)
if [ -f "${SSH_ENV}" ]; then  
  source "${SSH_ENV}" > /dev/null  
  # 检查 ssh-agent 是否可用  
  ssh-add -l > /dev/null 2>&1  
  if [ $? -ne 0 ]; then  
    start_agent  
  fi  
else  
  start_agent  
fi  

# ---- 你的其他自定义配置 ----  

可以在当前路径下自定义常用别名文件 .bash_aliases ,可参考文章:

Linux/Unix 常用的 15 类别名(alias)

2. 改进的 .bashrc 模板

针对在 Windows 的 Git Bash 环境下使用 ssh-agent ,结合自动启动、减少私钥密码多次输入的优化,下面给出了更完整且贴合实际的 .bashrc 配置示例,适用于:

  • Git Bash 下自带 ssh-agent ,但默认会话关闭就失效

  • 通过持久化 ssh-agent 环境变量,实现多终端共享同一代理,避免重复启动

  • 用 ssh-add -c 实现 "使用密钥时改为确认提示,避免重复输入密码"

其中的基础环境配置与上面的 .bashrc 模板示例一致,下面仅修改有关 ssh-agent 的配置。

bash 复制代码
# ---- ssh-agent 持久化配置 ----  

# 会在 ~/.ssh 路径下生成一个 environment 文件
# 使用一个固定的环境变量文件存储 ssh-agent 环境变量,让后续终端会话自动复用,确保 ssh-agent 会话持久
SSH_ENV="$HOME/.ssh/ssh-agent-environment"  

start_agent() {  
  echo "启动 SSH 代理..."  
  # 启动 ssh-agent 并保存环境变量  
  /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"  
  chmod 600 "${SSH_ENV}"  
  source "${SSH_ENV}" > /dev/null  
}

# 载入 ssh-agent 环境变量(如果文件存在)  
if [ -f "${SSH_ENV}" ]; then  
  source "${SSH_ENV}" > /dev/null  
  # 检查 ssh-agent 是否有效运行  
  ssh-add -l > /dev/null 2>&1  
  if [ $? -ne 0 ]; then  
    start_agent  
  fi  
else  
  start_agent  
fi  

# 添加默认密钥,使用 -c 选项要求每次确认,但避免重复输入密码  
# 你可根据需要改为 -q (静默) 或者不加选项
# 请根据实际密钥名称自行修改
if [ -f "$HOME/.ssh/id_rsa" ]; then  
  ssh-add -c "$HOME/.ssh/id_rsa" > /dev/null 2>&1  
elif [ -f "$HOME/.ssh/id_ed25519" ]; then  
  ssh-add -c "$HOME/.ssh/id_ed25519" > /dev/null 2>&1  
fi

# ---- 你的其他自定义配置 ----

3. 使用步骤

  • 备份现有 .bashrc :mv ~/.bashrc ~/.bashrc.backup

  • 编辑 .bashrc :nano ~/.bashrc

  • 粘贴上述模板内容,保存退出。

Nano 编辑器保存与退出:编辑完后使用 Ctrl + X 快捷键退出,会弹出 "Save modified buffer?" ,输入 "y" ,最后按一下 Enter 键即可退出。

  • 关闭所有 Git Bash 窗口后,再重新启动一个新终端,看看是否还有报错。

  • 若无报错,使用 ssh-add -l 命令验证 SSH 密钥是否自动添加成功,如果成功,会看到已添加的密钥列表,类似于 "xxx SHA256:... [你的邮箱] (RSA)" 。

【注】:

  • 如果还遇到 ssh-agent 找不到的问题,可以先确认:which ssh-agent ,如果仍是空,说明 Git Bash 里没有 ssh-agent ,你需要重新安装 Git ,或者用 Windows 系统服务的 ssh-agent 。

  • 第一次添加私钥时,会弹出确认对话框,输入一次密码即可。后续相同终端会话内用到密钥时会提示确认,但不会重复要求输入完整密码。

  • 关闭 Git Bash 后环境变量文件保留,再次打开会复用之前的 ssh-agent ,避免重复启动和密码输入。

  • 配置好 .bashrc 后首次启动 Git Bash 可能会出现如下警告,这是因为当前路径下没有 /.bash_profile 文件,这时会自动创建一个,关闭并重新启动 Git Bash 就不会出现这个警告了。

bash 复制代码
WARNING: Found ~/.bashrc but no ~/.bash_profile, ~/.bash_login or ~/.profile.

This looks like an incorrect setup.
A ~/.bash_profile that loads ~/.bashrc will be created for you.
启动 SSH 代理...
Identity added: /c/Users/Elowen/.ssh/id_rsa (xxx@xxx.com)
  • 当前路径下会生成一个 .bash_profile 文件,当前路径的 .ssh 目录下会生成一个 ssh-agent-environment 文件。

4. Bad address 报错(中文路径导致的异常)

1)遇到的问题

启动 Git Bash 时出现如下所示的问题:

遇到的这两个错误都提示 "Bad address" ,比较少见,尤其是在 Git Bash 环境下。结合用户名中有中文,很可能是路径或编码问题导致 Git Bash 内部对某些特殊文件处理异常。

bash 复制代码
bash: /dev/null: Bad address  
bash: /c/Users/<中文用户名>/.ssh/environment: Bad address  

2)可能原因

  • 路径中含中文字符,导致 Git Bash 或相关工具处理文件路径时出错。

  • ~/.ssh/environment 文件存在且格式错误或损坏。

  • /dev/null 设备文件在 Git Bash 环境中异常(可能是 msys2 环境的问题)。

  • SSH 代理启动脚本有问题或对特定路径处理不当。

3)解决方案

① 先尝试绕开中文路径问题:Git Bash 及其子系统(MSYS2)对中文路径兼容性有时不好。

② 检查或重命名 ~/.ssh/environment :在 Git Bash 终端执行以下命令,暂时重命名或移除文件。

bash 复制代码
mv ~/.ssh/environment ~/.ssh/environment.bak 2>/dev/null

如果目录下没有该文件,这命令也不会报错。然后重新打开 Git Bash ,看是否还报错。

③ 修复 /dev/null :/dev/null 是类 Unix 系统的空设备,Git Bash 其实是用 msys2 模拟的环境,它会用特殊设备模拟。bad address 错误可能说明 Git Bash 的运行环境出了问题。尝试:

  • 重新安装 Git for Windows 。

  • 在 Git Bash 中执行:ls -l /dev/null 命令,正常应该是个字符设备链接,或者伪设备。

如果 /dev/null 不存在或异常,可以尝试删除 /dev/null 然后重新创建(但是在 Git Bash 模拟环境一般不推荐手动修改 /dev)------最安全的方式还是重新安装 Git 。

④ 观察 SSH 代理启动流程:由于是 "启动 SSH 代理..." 出现的错误,猜测使用了自定义的启动脚本(比如 .bashrc 或 .bash_profile 里启动 SSH 代理)。检查一下相关启动脚本内容,看看有没有引用类似下面带路径的操作:eval $(ssh-agent) ,或者有调用 /c/Users/<用户名>/.ssh/environment 的命令。

相关推荐
软件测试很重要1 分钟前
UOS20系统安装与 SSH/XRDP 远程访问功能配置指南
linux·运维·ssh
国王不在家7 分钟前
git 切换仓库后清理分支缓存
git
Lynnxiaowen2 小时前
今天继续昨天的正则表达式进行学习
linux·运维·学习·正则表达式·云计算·bash
柯南二号4 小时前
【Gitlab】Ubuntu 20.04服务器部署Gitlab
git·gitlab
phac1234 小时前
git 如何直接拉去远程仓库的内容且忽略本地与远端不一致的commit
大数据·git·elasticsearch
ficker1316 小时前
git常用命令
git
抓饼先生17 小时前
Linux control group笔记
linux·笔记·bash
qinyia19 小时前
用 Wisdom SSH 轻松实现服务器自动化任务调度
服务器·自动化·ssh
kevin_cat21 小时前
微信群机器人-备份文件发送通知
git·bash·企业微信
程序媛Dev1 天前
50.4k Star!我用这个神器,在五分钟内搭建了一个私有 Git 服务器!
运维·服务器·git