首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

SSH和Git的基本知识

  • 25-04-24 11:01
  • 2280
  • 10655
blog.csdn.net

教程

PPT-lec2 - 2023秋冬实用技能拾遗 (tonycrane.cc)

B站视频

SSH安全外壳协议

概念

SSH 全称 secure shell,安全外壳协议(安全的shell),是一个计算机网络协议(默认端口号为22)。通过ssh协议可以在客户端安全(提供身份认证、信息加密)的远程连接Linux服务器或其他设备。

使用广泛的Xshell软件就是基于SSH协议远程连接。

  • SSH远程连接之后能干什么?
    • SSH远程连接之后,就可以像操作本地的机器一样操作远程机器。当需要操控的机器不在本地时就可以使用ssh协议远程连接操控。

相关链接blog

使用

ssh-keygen -t rsa -b 4096 -C "密钥名称"

  • -t rsa:指定生成RSA类型的密钥。
  • -b 4096:指定密钥的位数为4096位,这是RSA密钥的常用长度,提供较高的安全性。
  • -C "密钥名称":为密钥添加一个注释(通常是你的电子邮件地址或其他标识符),方便识别密钥。

完整的命令示例如下:

ssh-keygen -t rsa -b 4096 -C "[email protected]"
  • 1

执行这个命令后,ssh-keygen 会提示你输入保存密钥的文件路径和 passphrase(可选)。按照提示操作即可生成SSH密钥对。

生成的密钥对通常会保存在 ~/.ssh 目录下,默认情况下,公钥文件名为 id_rsa.pub,私钥文件名为 id_rsa。

如果你需要将生成的公钥添加到GitHub或其他Git托管服务,可以使用以下命令查看公钥内容:

cat ~/.ssh/id_rsa.pub
  • 1

然后将输出的内容复制到Git托管服务的SSH密钥设置页面中。

  1. 将公钥添加到Git托管服务:

    • GitHub:
      1. 登录GitHub。
      2. 点击右上角的头像,选择“Settings”。
      3. 在左侧菜单中选择“SSH and GPG keys”。
      4. 点击“New SSH key”按钮。
      5. 将公钥内容粘贴到“Key”字段中,并为密钥添加一个标题(如“My Laptop”)。
      6. 点击“Add SSH key”按钮。
    • GitLab:
      1. 登录GitLab。
      2. 点击右上角的头像,选择“Settings”。
      3. 在左侧菜单中选择“SSH Keys”。
      4. 将公钥内容粘贴到“Key”字段中,并为密钥添加一个标题(如“My Laptop”)。
      5. 点击“Add key”按钮。
  2. 配置本地Git仓库使用SSH URL: 确保你的本地Git仓库配置了使用SSH URL进行远程操作。例如:

    git remote set-url origin [email protected]:username/repo.git
    
    • 1
  3. 测试SSH连接: 你可以使用以下命令测试SSH连接是否成功:

    ssh -T [email protected]
    
    • 1

    如果连接成功,你会看到类似如下的输出:

    Hi username! You've successfully authenticated, but GitHub does not provide shell access.
    
    • 1

私钥

私钥(Private Key)在SSH密钥对中扮演着至关重要的角色。私钥是保密的,不应该与任何人共享。它的主要用途包括:

  1. 身份验证: 当你使用SSH连接到远程服务器或Git托管服务时,私钥用于验证你的身份。服务器会使用你的公钥(Public Key)来加密一条消息,然后只有拥有相应私钥的人才能解密并读取这条消息。这个过程称为“公钥加密”或“非对称加密”。
  2. 数字签名: 私钥还可以用于生成数字签名,以证明某个文件或消息确实是由你创建或发送的。数字签名可以防止篡改和伪造,确保数据的完整性和真实性。
  3. 安全通信: 在SSH会话中,私钥用于建立安全的加密通道,保护数据在传输过程中的机密性和完整性。

以下是一些具体的应用场景:

  • 远程登录: 当你使用 ssh user@host 命令连接到远程服务器时,SSH客户端会使用你的私钥进行身份验证。如果服务器上配置了你的公钥,并且和你本机上的私钥匹配,你就可以成功登录。

  • Git操作: 当你使用SSH URL进行Git操作(如 git push 或 git pull)时,Git会使用你的私钥进行身份验证。例如:

    git clone [email protected]:username/repo.git
    
    • 1
  • 文件传输: 当你使用SCP或SFTP进行安全的文件传输时,SSH会使用你的私钥进行身份验证。例如:

    scp localfile user@host:/remote/directory
    
    • 1

保护私钥的安全:

由于私钥的敏感性,必须采取适当的措施来保护它:

  1. 设置Passphrase: 在生成SSH密钥对时,ssh-keygen 会提示你设置一个Passphrase。Passphrase用于加密私钥文件,增加一层额外的安全保护。即使私钥文件被盗,没有Passphrase也无法使用。

  2. 限制访问权限: 确保私钥文件的访问权限设置为仅限你本人访问。你可以使用以下命令设置权限:

    chmod 600 ~/.ssh/id_rsa
    
    • 1
  3. 定期更换密钥: 定期生成新的SSH密钥对,并删除旧的密钥对,以减少密钥泄露的风险。

通过这些措施,你可以确保私钥的安全,从而保护你的系统和数据免受未经授权的访问。

know_host文件

在SSH密钥文件夹(通常是 ~/.ssh)中,known_hosts 文件用于存储你已经连接过的远程主机的公钥指纹。这个文件的作用是防止中间人攻击(Man-in-the-Middle Attack)。

当你第一次连接到一个新的远程主机时,SSH客户端会提示你确认主机的指纹,并将其存储在 known_hosts 文件中。以后每次连接到这个主机时,SSH客户端会检查主机的指纹是否与 known_hosts 文件中的记录匹配。如果不匹配,SSH客户端会发出警告,提示你可能存在安全风险。

known_hosts 文件的格式通常如下:

主机名,IP地址 公钥类型 公钥
  • 1

例如:

github.com,192.30.255.113 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmd...
  • 1

known_hosts 文件中的条目可以手动编辑,但通常不建议这样做,除非你确切知道自己在做什么。

至于 known_hosts.old 文件,它通常是在更新 known_hosts 文件时生成的备份文件。例如,当你更新SSH客户端或操作系统时,可能会重新生成 known_hosts 文件,并将旧文件重命名为 known_hosts.old。

处理 known_hosts 文件的常见操作:

  1. 查看 known_hosts 文件内容:

    cat ~/.ssh/known_hosts
    
    • 1
  2. 删除特定主机的条目: 如果你需要删除某个主机的条目,可以使用文本编辑器手动编辑 known_hosts 文件,或者使用以下命令:

    ssh-keygen -R 主机名或IP地址
    
    • 1

    例如:

    ssh-keygen -R github.com
    
    • 1
  3. 重新连接主机: 删除条目后,当你再次连接到该主机时,SSH客户端会提示你确认新的主机指纹,并将其添加到 known_hosts 文件中。

通过这些操作,你可以管理 known_hosts 文件,确保SSH连接的安全性和可靠性。

可信列表

Q: know_host文件就是把主机添加到可信列表的时候会产生的吗

Fitten Code:

A: 是的,当你第一次连接到一个新的远程主机时,SSH客户端会提示你确认主机的公钥指纹,并将其添加到 known_hosts 文件中。这个过程实际上就是将该主机添加到你的可信列表中。

具体步骤如下:

  1. 第一次连接到新主机: 当你第一次使用 ssh user@host 命令连接到一个新的远程主机时,你会看到类似如下的提示:

    The authenticity of host 'host (IP地址)' can't be established.
    RSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
    Are you sure you want to continue connecting (yes/no)?
    
    • 1
    • 2
    • 3
  2. 确认主机指纹: 你需要输入 yes 来确认主机的指纹,并将其添加到 known_hosts 文件中。此时,SSH客户端会显示类似如下的消息:

    Warning: Permanently added 'host,IP地址' (RSA) to the list of known hosts.
    
    • 1
  3. 指纹存储在 known_hosts 文件中: 确认后,主机的公钥指纹会被存储在 ~/.ssh/known_hosts 文件中。以后每次连接到这个主机时,SSH客户端会检查主机的指纹是否与 known_hosts 文件中的记录匹配。

通过这个过程,SSH客户端确保你连接到的主机是预期的主机,而不是中间人攻击者伪装的主机。这有效地防止了中间人攻击,提高了连接的安全性

Git

git基本命令

git init

git init: 用于在一个空文件夹初始化git项目,初始化之后,会出现一个**.git**文件夹,里面存储你的仓库和git项目信息

git clone

需求: 已知仓库在云端,拉取云端仓库到本地

使用git clone [email protected]:Ozxm/qt.git --depth 10 命令,进入git托管平台, 点击仓库,代码/Code,clone按钮,随便找一个方式(推荐使用ssh或者http协议)

参数:

  • --depth: 在Git中用于创建一个浅克隆(shallow clone),即只克隆仓库的历史记录中的最近一部分(最近的n次提交),而不是完整的仓库历史记录。这个参数可以显著减少克隆操作所需的时间和磁盘空间,特别是对于大型仓库

  • 扩展浅克隆:

    如果你在后续操作中需要更多的历史记录,可以使用以下命令扩展浅克隆:

    git fetch --depth <new-depth>
    
    • 1

    例如,如果你最初进行了 --depth 1 的浅克隆,并希望获取更多的历史记录:

    git fetch --depth 10
    
    • 1

通过这些命令,你可以根据需要灵活地使用浅克隆和扩展浅克隆,以平衡速度和完整性

git status

git status: 查看状态,确定一下是否有没有track的子模块

git config

git config: 用于配置git信息,便于查找是谁提交的修改,追根溯源

git config --global user.email "[email protected]"
git config --global user.name "usr'
  • 1
  • 2
git checkout

git checkout -b test: 创建新分支test并切换到新分支

  • 在某个特定的分支(例如 feature 分支)的基础上创建一个新的分支。以下是具体步骤:
  1. 切换到基础分支: 首先,你需要切换到你希望作为基础的分支。例如,假设你想在 feature 分支的基础上创建新分支:
git checkout feature
  • 1
  1. 创建并切换到新分支: 然后,你可以使用 git checkout -b 命令创建一个新的分支,并立即切换到该分支。例如,假设你要创建一个名为 test 的新分支:
git checkout -b test
  • 1
git add

把文件暂存更改,也可以直接使用Vscdoe的图形化界面(+号按钮)

git commit

提交更改到本地仓库,也可以直接使用Vscdoe的图形化界面(蓝色大框"√提交")

git commit -m “[提交标题]详细” 推荐提交信息格式

git push
  • 推送本地分支到远程仓库:
git push origin2 master
  • 1

这将把本地的 master 分支推送到名为 origin2 的远程仓库。

git push --set-upstream origin test

第一次提交新分支需要发布分支,使用上面的代码,也可以直接使用Vscode的图形化界面(发布分支)

后续可直接使用git push

-f: 表示强制提交

git pull

从远程仓库拉取更新:

git pull origin master
  • 1

这将从名为 origin的远程仓库拉取 master 分支的更新。

git reset

git reset --soft HEAD^: 回退到上一次提交

git 进阶命令

git remote
  • git remote -v: 列出我当前关联的远程仓库和分支
  • git remote add origin [email protected]:example.git: 命令用于向你的Git仓库添加一个新的远程仓库。这个命令将一个名为 `origin2 的远程仓库URL添加到你的本地Git配置中
git fetch

git fetch 命令用于从远程仓库下载最新的更改,但不会自动合并或修改当前工作目录中的内容。它只是更新本地仓库的远程跟踪分支,使你能够查看远程仓库的最新状态。

基本用法:

git fetch <远程仓库>
  • 1

其中 <远程仓库> 是远程仓库的名称,通常是 origin。

示例:

假设你有一个名为 origin 的远程仓库,并且希望获取最新的更改:

git fetch origin
  • 1

常用选项:

  • --all:获取所有远程仓库的更新。

    git fetch --all
    
    • 1
  • --prune:在获取更新之前,删除本地已经不存在的远程分支的跟踪分支。

    git fetch --prune origin
    
    • 1
  • --tags:获取所有的标签(tags)。

    git fetch --tags origin
    
    • 1
查看更新

在执行 git fech 之后,你可以使用以下命令查看远程分支的更新:

  • git branch -r:查看所有远程跟踪分支。

    git branch -r
    
    • 1
  • git log <本地分支>..<远程跟踪分支>:查看远程跟踪分支相对于本地分支的差异。

    git log master..origin/master
    
    • 1
合并更新

git fetch 不会自动合并或修改当前工作目录中的内容。如果你希望将远程分支的更新合并到本地分支,可以使用 git merge 或 git pull 命令。例如:

  • git merge:将远程跟踪分支合并到当前分支,用于将两个分支的历史合并。它会创建一个新的合并提交,并保留合并前两个分支的历史。

    git merge origin/master
    
    • 1
  • git pull:相当于 git fetch 加上 git merge。

    git pull origin master
    
    • 1
git rebase

git rebase 是一种不同于 git merge 的合并更改的方式。git rebase 通过将当前分支的提交重新应用到目标分支的最新提交之上,从而改变提交历史,使其更加线性和整洁。

基本用法:

git rebase <目标分支>
  • 1

其中 <目标分支> 是你希望将当前分支的提交重新应用到的分支。

示例:

假设你在一个名为 feature 的分支上工作,并且希望将其提交重新应用到 master 分支的最新提交之上:

git checkout feature
git rebase master
  • 1
  • 2

工作原理:

  1. 找到两个分支的共同祖先:git rebase 首先找到当前分支和目标分支的共同祖先。
  2. 保存当前分支的提交:将当前分支的提交保存为临时文件。
  3. 将当前分支重置到目标分支的最新提交:将当前分支的 HEAD 重置到目标分支的最新提交。
  4. 重新应用保存的提交:按照顺序重新应用之前保存的提交。

冲突解决:

如果在重新应用提交的过程中发生冲突,git rebase 会暂停并提示你解决冲突。解决冲突后,使用以下命令继续 rebase 过程:

git add <冲突文件>
git rebase --continue
  • 1
  • 2

中断 rebase:

如果你希望中断 rebase 过程并恢复到 rebase 之前的状态,可以使用以下命令:

git rebase --abort
  • 1

优缺点:

优点:

  • 线性的提交历史:git rebase 可以使提交历史更加线性和整洁,便于查看和理解。
  • 避免合并提交:git rebase 不会创建合并提交,从而保持提交历史的简洁。

缺点:

  • 改变提交历史:git rebase 会改变提交历史,可能会影响其他开发者的工作。
  • 冲突处理:如果在 rebase 过程中发生冲突,需要手动解决冲突,这可能会比较复杂。

示例流程:

  1. 切换到当前分支:

    git checkout feature
    
    • 1
  2. 执行 rebase:

    git rebase master
    
    • 1
  3. 解决冲突(如果需要):

    git add <冲突文件>
    git rebase --continue
    
    • 1
    • 2
  4. 完成 rebase:

    git rebase --continue
    
    • 1
    git cherry-pick

    要将某个特定的提交(通过其哈希值识别)引入当前分支,可以使用以下命令

    git cherry-pick

对于子模块更新

git submodule update --init --recursive 命令用于初始化和更新Git子模块(submodules)。子模块允许你在主仓库中包含其他Git仓库,并且可以独立地管理这些子仓库的版本。

  • 初始化子模块(--init): 如果子模块之前没有被初始化过,这个选项会初始化子模块,创建必要的子模块配置文件(.gitmodules)和子模块目录。
  • 递归更新子模块(--recursive): 这个选项会递归地更新所有子模块及其嵌套的子模块。也就是说,如果子模块本身也包含子模块,这个命令会一并处理这些嵌套的子模块。

命令会执行以下操作:

  • 初始化所有未初始化的子模块。
  • 更新所有子模块到指定的提交(通常是主仓库中记录的提交)。
  • 递归地处理所有嵌套的子模块。

这个命令通常在你克隆一个包含子模块的仓库后使用,以确保所有子模块都被正确初始化和更新到指定状态。例如:

git clone --recurse-submodules <主仓库URL>
cd <主仓库目录>
git submodule update --init --recursive
  • 1
  • 2
  • 3

gitee和github不同配置

Gitee(码云)和GitHub是两个不同的Git托管服务,虽然它们都支持Git协议,但在某些情况下,你可能需要为它们配置不同的Git设置。以下是一些常见的配置需求和方法:

  1. 不同的远程仓库URL: 如果你在Gitee和GitHub上都有仓库,并且希望在同一个本地仓库中管理它们,你需要为每个远程仓库配置不同的URL。例如:

    git remote add github https://github.com/username/repo.git
    git remote add gitee https://gitee.com/username/repo.git
    
    • 1
    • 2

    这样,你可以使用不同的远程名称来区分它们:

    git push github master
    git push gitee master
    
    • 1
    • 2
  2. 不同的用户配置: 如果你在Gitee和GitHub上使用不同的用户名和电子邮件地址,可以在本地仓库中配置不同的用户信息。例如:

    git config user.name "GitHub User"
    git config user.email "[email protected]"
    
    • 1
    • 2

    然后在另一个仓库中:

    git config user.name "Gitee User"
    git config user.email "[email protected]"
    
    • 1
    • 2
  3. 不同的SSH密钥: 如果你在Gitee和GitHub上使用不同的SSH密钥,可以在 ~/.ssh/config 文件中为每个主机配置不同的密钥。例如:

    # GitHub
    Host github.com
        HostName github.com
        IdentityFile ~/.ssh/id_rsa_github
        User git
    
    # Gitee
    Host gitee.com
        HostName gitee.com
        IdentityFile ~/.ssh/id_rsa_gitee
        User git
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  4. 不同的Git配置文件: 如果你希望为Gitee和GitHub使用不同的Git配置文件,可以在克隆仓库时指定不同的配置文件。例如:

    GIT_CONFIG=~/github.gitconfig git clone https://github.com/username/repo.git
    GIT_CONFIG=~/gitee.gitconfig git clone https://gitee.com/username/repo.git
    
    • 1
    • 2

git配置文件

Git配置文件用于存储Git的全局或本地配置选项,例如用户名、电子邮件地址、别名等。

生成SSH密钥:

  1. 生成GitHub的SSH密钥:

    ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/id_rsa_github
    
    • 1

    这将生成两个文件:~/.ssh/id_rsa_github(私钥)和 ~/.ssh/id_rsa_github.pub(公钥)。

  2. 生成Gitee的SSH密钥:

    ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/id_rsa_gitee
    
    • 1

    这将生成两个文件:~/.ssh/id_rsa_gitee(私钥)和 ~/.ssh/id_rsa_gitee.pub(公钥)。

配置SSH客户端:

在 ~/.ssh/config 文件中为每个主机配置不同的密钥。例如:

# GitHub
Host github.com
    HostName github.com
    IdentityFile ~/.ssh/id_rsa_github
    User git

# Gitee
Host gitee.com
    HostName gitee.com
    IdentityFile ~/.ssh/id_rsa_gitee
    User git
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

配置Git:

如果你希望为不同的仓库使用不同的Git配置文件,可以在克隆仓库时指定不同的配置文件。例如:

  1. 克隆GitHub仓库并使用特定的配置文件:

    GIT_CONFIG=~/github.gitconfig git clone [email protected]:username/repo.git
    
    • 1
  2. 克隆Gitee仓库并使用特定的配置文件:

    GIT_CONFIG=~/gitee.gitconfig git clone [email protected]:username/repo.git
    
    • 1

创建和编辑Git配置文件:

  1. 创建GitHub的Git配置文件:

    touch ~/github.gitconfig
    
    • 1
  2. 编辑GitHub的Git配置文件:

    [user]
        name = GitHub User
        email = [email protected]
    
    • 1
    • 2
    • 3
  3. 创建Gitee的Git配置文件:

    touch ~/gitee.gitconfig
    
    • 1
  4. 编辑Gitee的Git配置文件:

    [user]
        name = Gitee User
        email = [email protected]
    
    • 1
    • 2
    • 3
注:本文转载自blog.csdn.net的0zxm的文章"https://blog.csdn.net/x1343676/article/details/141572322"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

118
开源
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top