1.使用密钥连接服务器、推送代码

学习如何通过使用密钥连接服务器、并推送代码

1. 生成 SSH 密钥对(本地操作)

如果本地没有 SSH 密钥,先执行以下命令生成(已有的话跳过):

# 生成 RSA 密钥对(默认路径 ~/.ssh/id_rsa,也可自定义路径)
ssh-keygen -t rsa -b 4096 -C "你的邮箱/备注"
  • 执行后按 3 次回车:不需要设置密码(回车跳过),密钥会保存在 ~/.ssh/ 目录下(Windows 路径:C:\Users\你的用户名\.ssh\)。
  • 生成后会得到两个文件:
    • id_rsa:私钥(绝对不能泄露给他人);
    • id_rsa.pub:公钥(需要上传到服务器)。

2. 上传公钥到服务器(3 种方式)

方式 1:自动上传(推荐,需服务器密码登录权限)

本地执行命令,直接将公钥复制到服务器的授权列表:

# 替换为服务器用户名和 IP(如 root@192.168.1.100)
ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@服务器IP
  • 执行后输入服务器密码,公钥会自动添加到服务器的 ~/.ssh/authorized_keys 文件中(自动创建目录和文件,权限正确)。
方式 2:手动上传(无密码登录权限时用)
  1. 本地查看公钥内容并复制:
# Linux/Mac
cat ~/.ssh/id_rsa.pub
# Windows(PowerShell)
type C:\Users\你的用户名\.ssh\id_rsa.pub

登录服务器(密码登录),编辑授权文件:

# 登录服务器
ssh 用户名@服务器IP
# 若 .ssh 目录不存在,创建并设置权限
mkdir -p ~/.ssh && chmod 700 ~/.ssh
# 编辑授权文件(没有则自动创建)
vi ~/.ssh/authorized_keys

authorized_keys 中粘贴本地复制的公钥(一行一个公钥),保存退出(vi 按 Esc + :wq)。

设置文件权限(关键,否则密钥登录失败):

  1. chmod 600 ~/.ssh/authorized_keys
    
方式 3:通过 SCP 上传公钥文件
# 本地执行,将公钥文件上传到服务器临时目录
scp ~/.ssh/id_rsa.pub 用户名@服务器IP:/tmp/
# 登录服务器,将公钥添加到授权列表
ssh 用户名@服务器IP
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
rm /tmp/id_rsa.pub  # 删除临时文件

3. 测试密钥登录

本地执行以下命令,无需输入密码即可登录服务器:

ssh 用户名@服务器IP
  • 若仍需密码:检查服务器 ~/.ssh 目录权限(700)和 authorized_keys 权限(600),或重新上传公钥。

二、推送代码到服务器(Git 推送 / 文件推送)

场景 1:推送本地 Git 仓库到服务器 Git 仓库

1. 服务器端初始化 Git 裸仓库

登录服务器,创建一个裸仓库(用于接收代码,无工作目录):

# 示例:在服务器 /data/git 目录下创建仓库(自定义路径)
mkdir -p /data/git/my-project.git
cd /data/git/my-project.git
git init --bare  # 必须加 --bare,创建裸仓库
2. 本地 Git 配置并推送
  1. 本地 Git 仓库关联服务器仓库(首次推送):
# 进入本地 Git 项目目录
cd /本地项目路径
# 添加远程仓库(命名为 origin,可自定义)
git remote add origin 用户名@服务器IP:/data/git/my-project.git

推送代码(分支默认 main/master,根据实际修改):

  1. # 首次推送需指定分支关联(后续可直接 git push)
    git push -u origin main
    # 后续推送(已关联分支)
    git push
    
  • 若推送失败:检查服务器仓库路径是否正确、本地是否有提交(git commit 后再推)、服务器目录权限(确保用户有读写权限)。

场景 2:推送本地文件 / 目录到服务器(非 Git 方式)

scp 命令直接传输文件(基于 SSH 密钥,无需密码):

# 1. 推送单个文件
scp /本地文件路径 用户名@服务器IP:/服务器目标路径
# 示例:推送本地 test.txt 到服务器 /home/user 目录
scp ~/test.txt root@192.168.1.100:/home/user/

# 2. 推送整个目录(加 -r 递归传输)
scp -r /本地目录路径 用户名@服务器IP:/服务器目标路径
# 示例:推送本地 project 目录到服务器 /data 目录
scp -r ~/project root@192.168.1.100:/data/
  • 可选参数:
    • -P 端口号:若服务器 SSH 端口不是默认 22(如 2222),添加 -P 2222
    • -v:显示传输详情(排错用)。

三、常见问题排查

  1. 密钥登录失败
    • 服务器 sshd_config 配置:确保 PubkeyAuthentication yes(默认开启),重启 SSH 服务:systemctl restart sshd
    • 权限问题:~/.ssh 目录必须 700,authorized_keys 必须 600(其他权限会被 SSH 拒绝)。
  2. Git 推送失败
    • 服务器仓库不是裸仓库:必须用 git init --bare 创建,普通仓库无法接收推送;
    • 本地无远程分支关联:执行 git branch --set-upstream-to=origin/main main 关联后再推;
    • 权限不足:服务器仓库目录需给当前用户读写权限(如 chown -R 用户名:用户名 /data/git)。
  3. SCP 传输慢 / 失败
    • 大文件建议用 -C 参数压缩传输:scp -rC 本地目录 服务器路径
    • 网络不稳定:检查服务器防火墙是否放行 SSH 端口(22)。

通过以上步骤,即可实现无密码密钥登录服务器安全推送代码 / 文件。如果需要特定场景(如服务器是 GitHub/GitLab、Windows 本地操作)的细化步骤,可以补充说明~

  1. chmod 600 ~/.ssh/authorized_keys
    
方式 3:通过 SCP 上传公钥文件
# 本地执行,将公钥文件上传到服务器临时目录
scp ~/.ssh/id_rsa.pub 用户名@服务器IP:/tmp/
# 登录服务器,将公钥添加到授权列表
ssh 用户名@服务器IP
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
rm /tmp/id_rsa.pub  # 删除临时文件

3. 测试密钥登录

本地执行以下命令,无需输入密码即可登录服务器:

ssh 用户名@服务器IP
  • 若仍需密码:检查服务器 ~/.ssh 目录权限(700)和 authorized_keys 权限(600),或重新上传公钥。

二、推送代码到服务器(Git 推送 / 文件推送)

场景 1:推送本地 Git 仓库到服务器 Git 仓库

1. 服务器端初始化 Git 裸仓库

登录服务器,创建一个裸仓库(用于接收代码,无工作目录):

# 示例:在服务器 /data/git 目录下创建仓库(自定义路径)
mkdir -p /data/git/my-project.git
cd /data/git/my-project.git
git init --bare  # 必须加 --bare,创建裸仓库
2. 本地 Git 配置并推送
  1. 本地 Git 仓库关联服务器仓库(首次推送):
# 进入本地 Git 项目目录
cd /本地项目路径
# 添加远程仓库(命名为 origin,可自定义)
git remote add origin 用户名@服务器IP:/data/git/my-project.git

推送代码(分支默认 main/master,根据实际修改):

  1. # 首次推送需指定分支关联(后续可直接 git push)
    git push -u origin main
    # 后续推送(已关联分支)
    git push
    
  • 若推送失败:检查服务器仓库路径是否正确、本地是否有提交(git commit 后再推)、服务器目录权限(确保用户有读写权限)。

场景 2:推送本地文件 / 目录到服务器(非 Git 方式)

scp 命令直接传输文件(基于 SSH 密钥,无需密码):

# 1. 推送单个文件
scp /本地文件路径 用户名@服务器IP:/服务器目标路径
# 示例:推送本地 test.txt 到服务器 /home/user 目录
scp ~/test.txt root@192.168.1.100:/home/user/

# 2. 推送整个目录(加 -r 递归传输)
scp -r /本地目录路径 用户名@服务器IP:/服务器目标路径
# 示例:推送本地 project 目录到服务器 /data 目录
scp -r ~/project root@192.168.1.100:/data/
  • 可选参数:
    • -P 端口号:若服务器 SSH 端口不是默认 22(如 2222),添加 -P 2222
    • -v:显示传输详情(排错用)。

三、常见问题排查

  1. 密钥登录失败
    • 服务器 sshd_config 配置:确保 PubkeyAuthentication yes(默认开启),重启 SSH 服务:systemctl restart sshd
    • 权限问题:~/.ssh 目录必须 700,authorized_keys 必须 600(其他权限会被 SSH 拒绝)。
  2. Git 推送失败
    • 服务器仓库不是裸仓库:必须用 git init --bare 创建,普通仓库无法接收推送;
    • 本地无远程分支关联:执行 git branch --set-upstream-to=origin/main main 关联后再推;
    • 权限不足:服务器仓库目录需给当前用户读写权限(如 chown -R 用户名:用户名 /data/git)。
  3. SCP 传输慢 / 失败
    • 大文件建议用 -C 参数压缩传输:scp -rC 本地目录 服务器路径
    • 网络不稳定:检查服务器防火墙是否放行 SSH 端口(22)。

通过以上步骤,即可实现无密码密钥登录服务器安全推送代码 / 文件

image-20251109174031307