【Git】实现使用SSH方式连接远程仓库时的免密操作
SSH与HTTP(S)远程连接的优势对比:
SSH协议:
安全性高。使用非对称加密技术。通过公钥和私钥进行认证,数据传输加密。
认证方式是基于密钥的,将公钥上传至远程仓库,使用本地私钥进行连接,一次配置终身使用,无需反复输入密码。
免密操作容易实现,通过ssh-agent,可设置为一次输入密码就即可在多个会话中保持免密状态。
可能会受限于防火墙,SSH默认使用是22端口,该端口可能被禁用。
初次配置相较于HTTP是比较复杂的。
HTTP(S)协议:
安全性较低。使用用户名和密码进行认证,如果密码泄露或被截获,安全性会受到威胁。
认证方式是基于密码和令牌的,每次操作都需要输入用户名和密码,或者使用个人访问令牌(PAT),相对繁琐。
免密操作的实现需要用Git Credential Manager来缓存密码,存在安全风险。
通常不受到防火墙限制,使用的是443端口,这是所有网页的通用端口,通常不会被防火墙阻止。
只需要知道用户名和密码就可以开始使用,无需额外的操作。
使用SSH连接远程仓库并实现免密操作的步骤:
1.生成密钥对
# 在Git Bash下运行以下命令,注:将your_email@example.com替换为你的邮箱
ssh-keygen -t ed25519 -C "your_email@example.com"
# -t ed25519 指定了加密算法,ed25519 比传统的 rsa 更安全、更快。 # -C 选项为你的密钥添加一个注释。# 接着命令行会提示输入密码# 生成后,会在~/.ssh/目录下看到两个文件: # id_xxxxxx(这是私钥,放置在本地,不要泄露,就像钥匙) # id_xxxxxx.pub(这是公钥,放置在远程仓库,就像锁)
2.配置远程仓库
# 将公钥放入Github后保存
3.配置本地环境以实现免密
# 使用ssh-agent缓存私钥密码 # 在~/.目录下新建一个文件取名为.bash_profile # 编辑该文件如下
# 文件: ~/.bashrc# 这是一个用于管理 ssh-agent 生命周期的脚本, # 确保在 Git Bash 中只需输入一次密码。# 存储 ssh-agent 环境变量的文件路径 SSH_ENV="$HOME/.ssh/agent.env"# --- 启动一个新的 ssh-agent 进程 --- function start_agent() {echo "Starting a new ssh-agent..."# 'umask 077' 确保文件只有当前用户可读写(umask 077; ssh-agent >| "$SSH_ENV")echo "Agent started. Please enter your SSH key passphrase."# 加载新的环境变量. "$SSH_ENV" > /dev/nullssh-add }# --- 加载现有 ssh-agent 的环境变量 --- function load_agent_env() {if [ -f "$SSH_ENV" ]; then. "$SSH_ENV" > /dev/nullfi }# --- 主要逻辑 --- # 首先,尝试加载已有的 agent 环境变量 load_agent_env# 检查 SSH_AUTH_SOCK 是否已设置,并判断 agent 是否仍在运行 # 'ssh-add -l' 返回的退出码: # 0: agent 运行且有密钥 # 1: agent 运行但无密钥 # 2: agent 未运行 agent_status=$(ssh-add -l > /dev/null 2>&1; echo $?)if [ ! -n "$SSH_AUTH_SOCK" ] || [ "$agent_status" = "2" ]; then# agent 未运行,启动新进程start_agent elif [ "$agent_status" = "1" ]; then# agent 运行但无密钥,添加密钥echo "Agent is running but has no keys. Adding keys..."ssh-add else# agent 运行且有密钥,一切正常echo "Agent is running with keys. All set." fi# 清理辅助变量 unset SSH_ENV
# 编辑后保存
4.测试免密操作
# 打开一个git bash窗口,初次输入密码后 # 密码会被ssh-agent代理 # 之后打开其他窗口将不用进行密码输入