0


SSH和Git的基本知识

教程

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 -b4096-C"[email protected]"

执行这个命令后,

ssh-keygen

会提示你输入保存密钥的文件路径和 passphrase(可选)。按照提示操作即可生成SSH密钥对。

生成的密钥对通常会保存在

~/.ssh

目录下,默认情况下,公钥文件名为

id_rsa.pub

,私钥文件名为

id_rsa

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

cat ~/.ssh/id_rsa.pub

然后将输出的内容复制到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
  3. 测试SSH连接: 你可以使用以下命令测试SSH连接是否成功:ssh-T [email protected]如果连接成功,你会看到类似如下的输出:Hi username! You've successfully authenticated, but GitHub does not provide shell access.

私钥

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

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

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

  • 远程登录: 当你使用 ssh user@host 命令连接到远程服务器时,SSH客户端会使用你的私钥进行身份验证。如果服务器上配置了你的公钥,并且和你本机上的私钥匹配,你就可以成功登录。
  • Git操作: 当你使用SSH URL进行Git操作(如 git pushgit pull)时,Git会使用你的私钥进行身份验证。例如:git clone [email protected]:username/repo.git
  • 文件传输: 当你使用SCP或SFTP进行安全的文件传输时,SSH会使用你的私钥进行身份验证。例如:scp localfile user@host:/remote/directory

保护私钥的安全

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

  1. 设置Passphrase: 在生成SSH密钥对时,ssh-keygen 会提示你设置一个Passphrase。Passphrase用于加密私钥文件,增加一层额外的安全保护。即使私钥文件被盗,没有Passphrase也无法使用。
  2. 限制访问权限: 确保私钥文件的访问权限设置为仅限你本人访问。你可以使用以下命令设置权限:chmod600 ~/.ssh/id_rsa
  3. 定期更换密钥: 定期生成新的SSH密钥对,并删除旧的密钥对,以减少密钥泄露的风险。

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

know_host文件

在SSH密钥文件夹(通常是

~/.ssh

)中,

known_hosts

文件用于存储你已经连接过的远程主机的公钥指纹。这个文件的作用是防止中间人攻击(Man-in-the-Middle Attack)。

当你第一次连接到一个新的远程主机时,SSH客户端会提示你确认主机的指纹,并将其存储在

known_hosts

文件中。以后每次连接到这个主机时,SSH客户端会检查主机的指纹是否与

known_hosts

文件中的记录匹配。如果不匹配,SSH客户端会发出警告,提示你可能存在安全风险。

known_hosts

文件的格式通常如下:

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

例如:

github.com,192.30.255.113 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmd...
known_hosts

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

至于

known_hosts.old

文件,它通常是在更新

known_hosts

文件时生成的备份文件。例如,当你更新SSH客户端或操作系统时,可能会重新生成

known_hosts

文件,并将旧文件重命名为

known_hosts.old

**处理

known_hosts

文件的常见操作**:

  1. 查看 known_hosts 文件内容cat ~/.ssh/known_hosts
  2. 删除特定主机的条目: 如果你需要删除某个主机的条目,可以使用文本编辑器手动编辑 known_hosts 文件,或者使用以下命令:ssh-keygen -R 主机名或IP地址例如:ssh-keygen -R github.com
  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)?
  2. 确认主机指纹: 你需要输入 yes 来确认主机的指纹,并将其添加到 known_hosts 文件中。此时,SSH客户端会显示类似如下的消息:Warning: Permanently added 'host,IP地址' (RSA) to the list of known hosts.
  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>例如,如果你最初进行了 --depth 1 的浅克隆,并希望获取更多的历史记录:git fetch --depth10

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

git status
git status

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

git config
git config

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

git config --global user.email "[email protected]"git config --global user.name "usr'
git checkout
git checkout -b test

: 创建新分支test并切换到新分支

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

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

+

号按钮)

git commit

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

git commit -m “[提交标题]详细”

推荐提交信息格式

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

这将把本地的

master

分支推送到名为

origin2

的远程仓库。

git push --set-upstream origin test

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

后续可直接使用

git push

-f: 表示强制提交

git pull

从远程仓库拉取更新

git pull origin master

这将从名为

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 <远程仓库>

其中

<远程仓库>

是远程仓库的名称,通常是

origin

示例

假设你有一个名为

origin

的远程仓库,并且希望获取最新的更改:

git fetch origin

常用选项

  • --all:获取所有远程仓库的更新。git fetch --all
  • --prune:在获取更新之前,删除本地已经不存在的远程分支的跟踪分支。git fetch --prune origin
  • --tags:获取所有的标签(tags)。git fetch --tags origin
查看更新

在执行

git fech

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

  • git branch -r:查看所有远程跟踪分支。git branch -r
  • git log <本地分支>..<远程跟踪分支>:查看远程跟踪分支相对于本地分支的差异。git log master..origin/master
合并更新
git fetch

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

git merge

git pull

命令。例如:

  • git merge:将远程跟踪分支合并到当前分支,用于将两个分支的历史合并。它会创建一个新的合并提交,并保留合并前两个分支的历史。git merge origin/master
  • git pull:相当于 git fetch 加上 git mergegit pull origin master
git rebase
git rebase

是一种不同于

git merge

的合并更改的方式。

git rebase

通过将当前分支的提交重新应用到目标分支的最新提交之上,从而改变提交历史,使其更加线性和整洁。

基本用法

git rebase <目标分支>

其中

<目标分支>

是你希望将当前分支的提交重新应用到的分支。

示例

假设你在一个名为

feature

的分支上工作,并且希望将其提交重新应用到

master

分支的最新提交之上:

git checkout feature
git rebase master

工作原理

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

冲突解决

如果在重新应用提交的过程中发生冲突,

git rebase

会暂停并提示你解决冲突。解决冲突后,使用以下命令继续 rebase 过程:

gitadd<冲突文件>git rebase --continue

中断 rebase

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

git rebase --abort

优缺点

优点

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

缺点

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

示例流程

  1. 切换到当前分支git checkout feature
  2. 执行 rebasegit rebase master
  3. 解决冲突(如果需要)gitadd<冲突文件>git rebase --continue
  4. 完成 rebasegit rebase --continue##### git cherry-pick要将某个特定的提交(通过其哈希值识别)引入当前分支,可以使用以下命令git cherry-pick <commit_hash>

对于子模块更新

git submodule update --init --recursive

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

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

命令会执行以下操作:

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

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

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

gitee和github不同配置

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

  1. 不同的远程仓库URL: 如果你在Gitee和GitHub上都有仓库,并且希望在同一个本地仓库中管理它们,你需要为每个远程仓库配置不同的URL。例如:git remote add github https://github.com/username/repo.gitgit remote add gitee https://gitee.com/username/repo.git这样,你可以使用不同的远程名称来区分它们:git push github mastergit push gitee master
  2. 不同的用户配置: 如果你在Gitee和GitHub上使用不同的用户名和电子邮件地址,可以在本地仓库中配置不同的用户信息。例如:git config user.name "GitHub User"git config user.email "[email protected]"然后在另一个仓库中:git config user.name "Gitee User"git config user.email "[email protected]"
  3. 不同的SSH密钥: 如果你在Gitee和GitHub上使用不同的SSH密钥,可以在 ~/.ssh/config 文件中为每个主机配置不同的密钥。例如:# GitHubHost github.com HostName github.com IdentityFile ~/.ssh/id_rsa_github User git# GiteeHost gitee.com HostName gitee.com IdentityFile ~/.ssh/id_rsa_gitee User git
  4. 不同的Git配置文件: 如果你希望为Gitee和GitHub使用不同的Git配置文件,可以在克隆仓库时指定不同的配置文件。例如:GIT_CONFIG=~/github.gitconfig git clone https://github.com/username/repo.gitGIT_CONFIG=~/gitee.gitconfig git clone https://gitee.com/username/repo.git

git配置文件

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

生成SSH密钥

  1. 生成GitHub的SSH密钥ssh-keygen -t rsa -b4096-C"[email protected]"-f ~/.ssh/id_rsa_github这将生成两个文件:~/.ssh/id_rsa_github(私钥)和 ~/.ssh/id_rsa_github.pub(公钥)。
  2. 生成Gitee的SSH密钥ssh-keygen -t rsa -b4096-C"[email protected]"-f ~/.ssh/id_rsa_gitee这将生成两个文件:~/.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

配置Git

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

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

创建和编辑Git配置文件

  1. 创建GitHub的Git配置文件touch ~/github.gitconfig
  2. 编辑GitHub的Git配置文件[user] name = GitHub User email = [email protected]
  3. 创建Gitee的Git配置文件touch ~/gitee.gitconfig
  4. 编辑Gitee的Git配置文件[user] name = Gitee User email = [email protected]
标签: ssh git 运维

本文转载自: https://blog.csdn.net/x1343676/article/details/141572322
版权归原作者 0zxm 所有, 如有侵权,请联系我们删除。

“SSH和Git的基本知识”的评论:

还没有评论