0


ssh 和 git 教程(1万字超详细)

SSH(Secure Shell)是一种用于安全地访问和管理远程计算机的网络协议。它通过加密的连接在不安全的网络上提供安全的通信方式。SSH常用于远程登录、远程命令执行以及安全数据传输。

当我们使用Git进行版本控制时,经常需要将代码推送到远程仓库(例如GitHub、GitLab、Bitbucket等)或者从远程仓库拉取代码。其中访问远程仓库使用的就是SSH

SSH的主要功能

  1. 远程登录:通过SSH客户端,你可以远程登录到另一台计算机,获取其终端会话。
  2. 远程命令执行:可以在远程计算机上执行命令,而无需直接登录到远程终端。
  3. 安全数据传输:使用SCP(Secure Copy Protocol)或SFTP(SSH File Transfer Protocol)在本地和远程计算机之间安全地传输文件。
  4. 端口转发:通过SSH隧道,可以将本地端口流量转发到远程服务器,或将远程端口流量转发到本地。

1、使用ssh连接远程服务器

服务器安装开启 SSH 服务

在 Ubuntu 上,你可以通过以下命令安装和启动 SSH 服务:

sudoapt update
sudoaptinstall openssh-server
sudoservicessh start

在 CentOS 上,可以使用:

sudo yum install openssh-server
sudoservicessh start

检查 SSH 服务是否正在运行:

servicessh status
 # 成功会显示有 Active: active (running)## service ssh restart 这个是重启的命令
获取服务器的 IP 地址
ifconfig

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.176.128 netmask 255.255.255.0 broadcast 192.168.176.255
inet6 fe80::fd92:f82d:65e0:3bda prefixlen 64 scopeid 0x20<link>

我的是 192.168.176.128


查找类似于

192.168.x.x

10.x.x.x

的地址,这将是虚拟机的 IP 地址。(如果是云服务器会是公网ip)

本地通过 ssh 连接远程服务器

打开 PowerShell 使用

ssh

命令连接到虚拟机。 例如:

ssh [email protected] -p 22
# -p 和 22 可以不写# -p 指定端口, ssh默认是 22 端口, 如果你修改了端口, 那么 -p 需要指向你修改的端口

其中

username

是你在虚拟机上的用户名,

192.168.x.x

是虚拟机的 IP 地址。
用户名就是

/home/

文件夹的文件夹名

示例

假设虚拟机的 IP 地址是

192.168.1.100

,你的虚拟机用户名是

user

,那么在 PowerShell 中你可以输入:

ssh [email protected] -p 22

然后输入虚拟机上的用户密码以完成登录。

注意事项

如果按照上面弄完本地无法通过ssh连接服务器

  • 防火墙配置:确保服务器的防火墙允许 SSH 连接。你可以在虚拟机上使用以下命令开放 SSH 端口(通常是 22):sudo ufw allow ssh
  • ssh配置# 编辑配置文件(默认是ssh配置文件不允许以root用户登陆)vim /etc/ssh/sshd_config# 在 sshd_config中添加如下内容PermitRootLogin yesPasswordAuthentication yes# 上面两个内容分别是允许 ssh以 root 用户登陆 和 启用了密码认证

2、简化ssh登陆配置

可以通过创建 SSH 配置文件来简化连接过程,使得每次连接时不需要重复输入用户名和主机号。以下是如何配置 SSH 配置文件的步骤:

1、 编辑 SSH 配置文件

打开 PowerShell 或你的终端

编辑 SSH 配置文件。

配置文件通常位于

~/.ssh/config

(在 Windows 上通常是

C:\Users\YourUsername\.ssh\config

)。如果文件不存在,你可以创建它。

vim ~/.ssh/config
# ~ 表示用户的根目录

添加 SSH 配置

在配置文件中添加类似以下的配置项:

Host myvm
    HostName 192.168.1.100
    User yourusername
    Port 22
  • Host: 这是你用来标识主机的别名。在这个例子中,我们用 myvm 作为别名。
  • HostName: 这是实际的主机名或 IP 地址。
  • User: 这是连接时使用的用户名。
  • Port: 这是 SSH 连接使用的端口,默认为 22(可以省略,如果使用默认端口)。

保存并测试

ssh myvm

这样,你就可以使用你配置的别名(如

myvm

)来连接虚拟机,而不需要每次都输入用户名和主机号。

3、ssh 免密登陆配置

要实现 SSH 免密码登录,你需要配置 SSH 密钥认证。以下是详细步骤:

在本地生成 SSH 密钥对

打开 PowerShell 或终端。

生成 SSH 密钥对。运行以下命令,并按照提示操作:

ssh-keygen
# 运行这个命令会让你填很多选项,我可以一路回车,直接默认就行
将公钥复制到远程主机

将本地

C:\Users\YourUsername\.ssh\

中的

id_rsa.pub

的内容复制到服务器的

~/.ssh/authorized_keys

文件中。(

~

表示服务器的用户的根目录,服务器如果没有.ssh 和 authorized_keys 文件的话可以自己创建 )

测试免密码登录
ssh user@remote_host
# 如果配置的有简化登陆的话 可以直接 ssh mymv# mymv 是上面简化登录时候自己配置的名字

如果一切设置正确,你应该能够无需输入密码即可登录到远程主机。

4、scp

scp

(Secure Copy Protocol)是一个用于在本地和远程主机之间安全地复制文件和目录的命令行工具。它利用 SSH 协议来加密数据传输。

基本语法

scp[options]source destination
  • source:要复制的源文件或目录。
  • destination:目标位置,可以是本地或远程路径。

常用选项

  • -r:递归复制整个目录。如果要复制目录及其内容,必须使用这个选项。scp-r localdir user@remotehost:/path/to/remote/dir
  • -P:指定远程主机的端口号。注意,大写的 -P 与小写的 -p 不同,大写的 -P 是用来指定端口的。scp-P2222 localfile user@remotehost:/path/to/remote/file
1.
user@remotehost
  • **user**:这是远程主机的用户名。
  • **remotehost**:这是远程主机的主机名或 IP 地址。
2.
:/path/to/remote/file
  • **冒号 :**:冒号分隔符用于区分用户名和主机地址与远程路径之间的界限。冒号后面的部分是文件在远程主机上的路径。
  • **/path/to/remote/file**:这是远程主机上的文件或目录的绝对路径。- 绝对路径:以 / 开头,表示从根目录开始的完整路径。示例:/home/alice/documents/file.txt 表示在远程主机的 /home/alice/documents 目录下的 file.txt 文件。- 相对路径:如果路径没有以 / 开头,它是相对于远程用户的家目录(通常是 ~)的路径。示例:documents/file.txt 表示在远程主机的用户家目录下的 documents 目录中的 file.txt 文件。

文件传输的例子

  1. 从本地复制文件到远程主机scp localfile user@remotehost:/path/to/remote/file- 这将把本地文件 localfile 复制到远程主机的 /path/to/remote/ 目录下,并重命名为 file
  2. 从远程主机复制文件到本地scp user@remotehost:/path/to/remote/file localfile- 这将把远程主机上的 /path/to/remote/file 文件复制到本地,并重命名为 localfile
  3. 递归复制本地目录到远程主机scp-r localdir user@remotehost:/path/to/remote/dir- 这将把本地目录 localdir 及其所有内容复制到远程主机的 /path/to/remote/dir 目录下。
  4. 从远程主机递归复制目录到本地scp-r user@remotehost:/path/to/remote/dir localdir- 这将把远程主机上的 /path/to/remote/dir 目录及其所有内容复制到本地的 localdir 目录中。
使用场景
  • 备份文件:可以用来将本地文件备份到远程服务器。
  • 分发文件:将文件从一台计算机分发到多台计算机上。
  • 跨平台文件传输:在不同操作系统之间传输文件,例如从 Windows 计算机到 Linux 服务器。
安全性
scp

使用 SSH 协议进行文件传输,因此提供了加密传输,确保数据在传输过程中不会被窥视或篡改。

总结
scp

是一个简单且安全的文件传输工具,适合基本的文件复制任务。它利用 SSH 协议进行加密传输,支持本地和远程之间的文件复制操作。

linux中我们常用到的是 tmux 和 vim, 这两个的配置文件在 用户的根目录下(

/home/username

), 通过

ls -a

可以看到

.vimrc

.tmux.conf

的配置文件。我们可以通过

scp

命令快速的配置一个服务器的常用功能.

tmux、vim参考文章

3、Git 概述

什么是Git

Git是一个分布式版本控制系统,用于跟踪文件的更改并协调不同用户之间的代码开发工作。它最初由Linus Torvalds于2005年为Linux内核开发设计。与集中式版本控制系统(如Subversion)不同,Git允许每个用户拥有自己的完整版本库副本,使得分布式开发和离线工作变得非常方便。

Git的核心概念及其关系

版本库(Repository)
  • 本地版本库(Local Repository):存储在你自己的电脑上的Git版本库。
  • 远程版本库(Remote Repository):存储在服务器上的版本库,可以通过网络访问,例如GitHub、GitLab等。
工作区(Working Directory)
  • 工作区是你在电脑上查看和编辑文件的地方。
  • 它包含了项目的所有文件和目录。
  • 你在工作区中对文件所做的更改需要被添加到暂存区然后提交到版本库。
暂存区(Staging Area)
  • 暂存区是一个临时存储区域,在这里你可以将所有将要提交的文件快照进行暂存。
  • 通过使用git add命令,你可以将工作区中的更改添加到暂存区。
  • 暂存区允许你分步提交文件的更改,而不是一次提交所有的更改。
提交(Commit)
  • 提交是将暂存区中的内容永久性地保存到本地版本库的过程。
  • 每次提交都会生成一个唯一的提交ID,用于标识该提交。
  • 提交操作会记录更改的详细信息,如时间、作者、提交信息等。
分支(Branch)
  • 分支是Git中独立的开发线,每个分支都有自己的提交历史。
  • 默认的主分支通常叫mainmaster
  • 通过创建分支,你可以在不影响其他分支的情况下进行开发,之后可以合并分支的更改。
远程仓库(Remote Repository)
  • 远程仓库是托管在服务器上的版本库,用于团队协作和备份。
  • 通过克隆、拉取和推送操作,本地仓库和远程仓库之间可以进行数据同步。
概念之间的关系
  1. 工作区与暂存区:工作区是你实际编辑文件的地方,而暂存区是一个临时区域,用于暂时保存即将提交的更改。通过git add命令将工作区的更改添加到暂存区。
  2. 暂存区与版本库:当你将更改添加到暂存区后,通过git commit命令将暂存区的内容永久性地保存到版本库中。
  3. 本地版本库与远程版本库:本地版本库是你在自己的电脑上工作的地方,远程版本库是托管在服务器上的版本库。通过git pushgit pull命令实现本地与远程版本库的同步。
  4. 分支与提交:分支是不同的开发线,每个分支有独立的提交历史。你可以在不同的分支上进行开发,然后将分支合并,以便整合不同的开发工作。

4、Git的常见用法

以下是Git的一些常见用法,包含如何初始化、克隆、提交、更改、分支操作和与远程仓库交互等。

1. 安装Git

在大多数Linux系统上,你可以通过包管理器安装Git:

sudoapt-getinstallgit# Debian/Ubuntusudo yum installgit# CentOS/RHEL

在macOS上,你可以使用Homebrew安装Git:

brew installgit

在Windows上,你可以从Git官方网站下载并安装Git。

2. 初始化版本库

使用

git init

命令初始化一个新的Git版本库。

mkdir my_project
cd my_project
git init
3. 检查状态

使用

git status

命令查看工作区的当前状态。

git status
4. 添加文件到暂存区

使用

git add

命令将文件添加到暂存区。

gitadd filename          # 添加单个文件gitadd.# 添加所有更改的文件
5. 提交更改

使用

git commit

命令提交暂存区的更改。

git commit -m"Commit message"# 我们使用 commit 后会创建一个新的提交, 每个提交都有位移的hashId, 相当于是快照, 我们可以在不同的快照之间切换
6. 查看提交历史

使用

git log

命令查看提交历史。

git log
7. 回滚操作
git reset

是一个非常强大的命令,用于回滚提交和更改文件状态。它有三种主要模式:

--soft

--mixed

(默认)和

--hard

。以下是常用命令的简要介绍:

1.
git reset --soft
  • 只重置HEAD指针,不影响暂存区和工作区的文件。适用于希望保留更改但撤销提交的情况。
git reset --soft<commit_hash>
2.
git reset --mixed

(默认)

  • 重置HEAD指针和暂存区,但不影响工作区的文件。适用于希望保留更改但取消暂存的情况。
git reset --mixed<commit_hash># 或git reset <commit_hash># 默认使用 --mixed 模式
3.
git reset --hard
  • 重置HEAD指针、暂存区和工作区的文件。适用于希望完全回滚到指定提交并删除所有更改的情况。
git reset --hard<commit_hash>

git reflog

用于记录每次HEAD的移动情况,即使是回滚或重置的操作也会被记录。它在需要恢复误操作时非常有用。以下是常用命令的简要介绍:

1. 查看Reflog
  • 显示HEAD的历史变动记录。
git reflog
2. 恢复到Reflog中的某个状态
  • 使用reflog中的某个状态来恢复HEAD、暂存区和工作区。
git reset --hard<reflog_hash>
8、恢复和撤销操作
git restore

是一个用于恢复或取消更改的命令,它是Git 2.23引入的新命令,旨在简化并替代一些常见的恢复操作,如撤销工作区的更改或取消暂存的更改。以下是

git restore

的常用命令及其用法的简要介绍:

恢复工作区中的文件

如果你在工作区中修改了文件但尚未添加到暂存区,你可以使用

git restore

命令来撤销这些更改:

git restore <filename># 恢复特定文件git restore .# 恢复所有文件

这个命令会将工作区中的文件恢复到最近一次提交时的状态。

取消暂存的文件

如果你已经使用

git add

将文件添加到暂存区,但还没有提交,你可以使用

git restore --staged

命令来取消暂存:

git restore --staged<filename># 取消暂存特定文件git restore --staged.# 取消暂存所有文件

这个命令会将暂存区中的文件恢复到工作区的状态。

高级用法

1. 恢复到指定提交

你可以使用

--source

选项指定要恢复的源提交:

git restore --source=<commit_hash><filename>

这个命令会将指定文件恢复到特定提交的状态。

2. 与其他选项结合使用
git restore

还有一些其他选项,可以进一步控制恢复操作:

  • --worktree:只恢复工作区中的文件(这是默认行为)。
  • --staged:只恢复暂存区中的文件。
  • -s--source:指定源提交。

示例操作

假设你在项目中进行了一些更改,并使用

git restore

进行恢复:

恢复工作区中的更改

你修改了文件

file1.txt

,但不想保留这些更改:

git restore file1.txt
取消暂存的更改

你暂存了文件

file2.txt

,但还没有提交,现在想取消暂存:

git restore --staged file2.txt
恢复到指定提交

你想将

file3.txt

恢复到提交

abc1234

的状态:

git restore --source=abc1234 file3.txt

5、与远程仓库交互

把本地仓库上传到远程仓库 (云仓库), 可以让项目脱离本地, 可以让我们随时用不同的电脑获取并修改项目的内容

  • 添加远程仓库:使用 git remote add 命令添加远程仓库。(这里需要注意, 下面的操作基本都是通过 ssh 跟远程仓库进行通信的, 像push pull 是通过 scp 实现的)git remote add origin https://github.com/user/repo.git# 我们一般用的都是 github 来创建一个项目当作远程仓库, 我们需要 执行上面讲的 "ssh中讲到的免密登陆配置" 类似的操作# 在本地通过 ssh 生成一个私钥和公钥, 把公钥里的内容粘贴到 github setting 中的 ssh 添加一个 ssh key 中# 这样就可以免密登陆远程仓库了# origin:这是远程仓库的名称,通常默认用 origin 来指代主远程仓库。# 当运行 git push 或 git pull 命令时,如果没有指定其他远程仓库,Git 会默认使用 origin。# url 是 github 的仓库地址
  • 推送到远程仓库:使用 git push 会将本地分支的提交推送到远程分支git push <remote><branch># 可以在 .git同级目录下创建一个 .gitignore 文件, 在里面可以写 git push 时要忽略的文件名- <remote>:远程存储库的名称,通常是origin。- <branch>:要推送的本地分支的名称。git push origin main # 推送到远程主分支git push origin new_branch # 推送到远程新分支
  • 拉取远程更改:git pull命令用于从远程存储库获取最新的更改,并将它们合并到本地分支。它相当于执行了git fetch和git merge两个操作。git pull <remote><branch>- <remote>:远程存储库的名称,通常是origin。- <branch>:要拉取的远程分支的名称。git pull origin main
  • 获取远程仓库信息:使用 git fetch 命令获取远程仓库的最新信息,但不进行合并。git fetch origin
  • 克隆远程仓库:使用 git clone 命令从远程仓库克隆一个版本库到本地。git clone https://github.com/user/repo.git

6、不常用的操作

在Git中,分支的操作有时不如其他操作常用。当我们初始化一个Git仓库时,默认会创建一个名为

master

(或在新版本中是

main

)的分支。每次执行

git commit

命令时,都会在当前分支上创建一个新的提交。

此外,我们可以在任何一个提交上创建一个新分支。这个新分支会包含当前提交的所有内容。当我们在新分支上进行提交操作时,这些提交记录会添加到新分支上,而不会影响原来的分支。

这种表达应该更加准确和清晰。如果你还有其他问题或需要进一步修改,请告诉我!

1. 创建和切换分支

使用

git branch

命令创建新分支,使用

git checkout

命令切换分支。

git branch new_branch     # 创建新分支 new_branch 是新分支的 namegit checkout new_branch   # 切换到新分支

或使用

git checkout -b

一次性完成分支的创建和切换。

git checkout -b new_branch
2. 上传分支

将本地分支推送到远程仓库。

git push origin your-branch-name

如果希望本地分支与远程分支关联,以便在将来进行拉取或推送时不需要指定远程分支名称,可以使用以下命令:

git push --set-upstream origin your-branch-name
3. 合并分支

使用

git merge

命令将分支合并到当前分支。

git checkout main        # 切换到主分支git merge new_branch     # 合并new_branch到主分支
4. 解决合并冲突

合并过程中,如果有冲突,Git会标记冲突部分,用户需要手动解决冲突并提交解决后的更改。

# 编辑冲突文件,解决冲突后gitadd conflicted_file
git commit -m"Resolved merge conflict"
5. 查看分支信息

使用

git branch

命令查看本地分支,使用

git branch -r

查看远程分支。

git branch          # 查看本地分支git branch -r# 查看远程分支
6. 删除分支

使用

git branch -d

命令删除本地分支。

git branch -d branch_name  # 删除本地分支

使用

git push origin --delete

命令删除远程分支。

git push origin --delete branch_name  # 删除远程分支
标签: ssh git 运维

本文转载自: https://blog.csdn.net/m0_74065705/article/details/140897830
版权归原作者 小程xy 所有, 如有侵权,请联系我们删除。

“ssh 和 git 教程(1万字超详细)”的评论:

还没有评论