一. SSH 和 OpenSSH 简介
SSH(Secure Shell)
SSH(Secure Shell)是一种用于安全访问远程计算机的网络协议。它提供了一种加密的方法来确保数据传输的安全性,从而防止网络攻击和数据窃取。SSH主要用于以下几个方面:
- 远程登录:通过SSH,可以安全地登录到远程计算机进行操作。
- 远程命令执行:可以在远程计算机上运行命令。
- 文件传输:通过SCP(Secure Copy Protocol)或SFTP(SSH File Transfer Protocol),可以安全地在本地和远程计算机之间传输文件。
SSH 的通信方式包括对数据进行加密,防止第三方窃听和篡改,从而提供了一种安全的通信通道。
SSH的基本工作原理
- 客户端发起连接请求。
- 服务端响应请求,并发送其公钥。
- 客户端使用服务端的公钥对通信进行加密。
- 服务端使用其私钥解密通信内容,从而建立安全连接。
OpenSSH
OpenSSH 是SSH协议的一个开源实现,由OpenBSD项目团队开发和维护。OpenSSH不仅实现了SSH协议的核心功能,还提供了许多额外的工具和功能,增强了SSH的使用体验和安全性。OpenSSH主要包括以下组件:
- ssh:用于连接到远程计算机的客户端程序。
- sshd:在远程计算机上运行的守护进程,处理来自客户端的连接请求。
- scp:用于安全地复制文件的工具。
- sftp:用于安全文件传输的工具,类似于FTP,但通过SSH进行加密。
- ssh-keygen:用于生成公钥和私钥对的工具。
- ssh-agent和ssh-add:用于管理和使用私钥的工具,简化了密钥管理。
- ssh-copy-id:用于将本地公钥添加到远程主机的
authorized_keys
文件中。
SSH连接方式
密码连接
最简单的SSH连接方式是使用用户名和密码进行身份验证:
ssh username@hostname
缺点是安全性较低,容易被暴力破解。
密钥对连接
为了提高安全性,推荐使用密钥对进行身份验证。密钥对由公钥和私钥组成:
- 私钥:保存在客户端,不可泄露。
- 公钥:保存在服务端的
~/.ssh/authorized_keys
文件中。
二. OpenSSH核心操作
1. 生成密钥对
使用ssh-keygen
命令可以生成一个SSH密钥对,包括一个公钥和一个私钥。
ssh-keygen
- 默认文件名:
id_ed25519
(私钥)和id_ed25519.pub
(公钥)。 - 可以自定义文件名以避免覆盖已有密钥对。
命令参数:
-t
:指定密钥类型,常用值有rsa
、dsa
、ecdsa
、ed25519
等。-b
:指定密钥长度,例如-b 2048
表示生成2048位的RSA密钥对。-C
:指定密钥的注释信息,例如`-CMy SSH Key。-f
:指定生成的密钥文件的路径和文件名,例如-f /home/user/.ssh/id_ed25519
。-P
: 指定密钥的passphrase密码为“your passphrase”,例如-P your passphrase。
例:
ssh-keygen -t ed25519 -C "[email protected]" -P your passphrase
在生成密钥对时,可以选择是否添加密码(Passphrase)。如果添加了密码,那么在使用私钥进行登录时,需要输入密码。如果未添加密码,那么在使用私钥进行登录时,不需要输入密码。
2. 复制公钥到服务器
将生成的公钥复制到服务器上的authorized_keys文件中。
方法1
cat id_ed25519.pub | ssh root@server 'cat >> authorized_keys'
命令参数:
id_ed25519.pub
:包含公钥的文件,通常位于/home/user/.ssh/id_ed25519.pub
。root@server
:服务器的root用户和IP地址。
方法2
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@hostname
命令参数:
-i
:指定公钥路径。username@hostname
:服务器的用户名和IP地址或域名。 这会将公钥添加到服务器上的~/.ssh/authorized_keys
文件中。
3. 禁用密码验证,使用公钥验证
在服务器上的sshd_config文件中,找到PasswordAuthentication
选项,并将其设置为no
,找到PubkeyAuthentication
选项,并将其设置为yes
。
编辑服务端的/etc/ssh/sshd_config
文件进行配置。
vi /etc/ssh/sshd_config
- 禁用密码验证:
PasswordAuthentication no
- 启用密钥对验证:
PubkeyAuthentication yes
- 重启
sshd
服务:
sudo systemctl restart sshd
命令参数:
/etc/ssh/sshd_config
:sshd配置文件的路径。
4.配置~/.ssh/config
文件以简化连接
在本地配置文件中指定私钥路径,方便连接服务器。
nano ~/.ssh/config
命令参数:
~/.ssh/config
:本地SSH配置文件的路径。
指定私钥路径的详细用例
假设你的私钥路径为/home/user/.ssh/id_ed25519
,那么在~/.ssh/config
文件中可以这样配置:
Host server
HostName server.com
User root
IdentityFile /home/user/.ssh/id_ed25519
其中server
是主机名,server.com
是服务器的域名,root
是登录服务器的用户名,/home/user/.ssh/id_ed25519
是私钥文件的路径。 这样就可以使用简短命令:ssh myserver
连接服务端 这样虽然不需要再用-i
指定私钥路径,但是还是需要输入Passphrase
三. SSH-Agent 和 SSH-Add 详细介绍
1. SSH-Agent
ssh-agent
是一个用于管理私钥的后台程序。它可以在内存中缓存私钥,从而避免在每次使用私钥时都需要手动输入密码(Passphrase)。SSH-Agent 为用户提供了一个安全的密钥管理环境,特别是在需要频繁使用私钥进行身份验证的场景中非常有用。
SSH-Agent 的使用步骤
启动 SSH-Agent: 在大多数 Linux 和 macOS 系统中,
ssh-agent
通常已经包含在默认的系统安装中。可以使用以下命令启动它:eval $(ssh-agent -s)
这条命令会启动
ssh-agent
并将其进程 ID 输出到当前 Shell 环境变量中。添加私钥到 SSH-Agent: 使用
ssh-add
命令将私钥添加到ssh-agent
中。例如:ssh-add ~/.ssh/id_ed25519
如果私钥文件使用了密码保护,则此时会提示输入密码。
查看加载的私钥: 可以使用
ssh-add -l
命令来查看当前ssh-agent
中加载的私钥列表:ssh-add -l
删除私钥: 可以使用
ssh-add -d
命令删除特定的私钥,或者使用ssh-add -D
命令删除所有加载的私钥:ssh-add -d ~/.ssh/id_rsa ssh-add -D
停止 SSH-Agent: 当不再需要
ssh-agent
时,可以使用以下命令停止它:eval $(ssh-agent -k)
2. SSH-Add
ssh-add
是一个用于向 ssh-agent
添加私钥的命令。它可以将私钥添加到 ssh-agent
中,使得在使用 SSH 连接时无需重复输入密码。
SSH-Add 的常用命令
添加私钥: 将指定的私钥文件添加到
ssh-agent
中:ssh-add ~/.ssh/id_rsa
查看加载的私钥: 显示当前
ssh-agent
中加载的私钥列表:ssh-add -l
删除私钥: 从
ssh-agent
中删除指定的私钥:ssh-add -d ~/.ssh/id_rsa
删除所有私钥: 从
ssh-agent
中删除所有加载的私钥:ssh-add -D
SSH-Add 的选项
-l
:列出当前ssh-agent
中加载的所有私钥。-d [file]
:从ssh-agent
中删除指定的私钥。-D
:删除ssh-agent
中的所有私钥。-p
:提示输入私钥的密码。
四. 远程文件传输
使用scp
命令
scp
命令用于在主机之间安全复制文件。
scp localfile username@hostname:/path/to/remote/file
scp username@hostname:/path/to/remote/file localfile
使用sftp
命令
sftp
提供交互式文件传输。
sftp username@hostname
五. GitHub SSH连接
1. 生成 SSH 密钥对
首先,在本地生成一个新的 SSH 密钥对。打开终端并运行以下命令:
# windows
ssh-keygen -t ed25519 -C GitHub -f F:\\reps\\ssh\\id_github
# linux
ssh-keygen -t ed25519 -C GitHub -f /home/user/.ssh/id_github
命令参数:
-t ed25519
:指定密钥类型为ed25519。-C GitHub
:指定密钥的注释信息为GitHub。-f
:指定生成的密钥文件的路径和文件名,例如F:\reps\ssh\id_github
,路径为:F:\reps\ssh\
,文件名为:id_github
。
2. 添加 SSH 密钥到 ssh-agent
启动 ssh-agent
:
- windows 系统
# 1.打开 服务 管理器(按 `Win + R`,输入 `services.msc`,然后按回车)。
# 2.找到 OpenSSH Authentication Agent 服务。
# 3.右键点击该服务并选择 `属性` 启动类型选择 `手动`。
# 4.输入以下命令启动 `ssh-agent`:
Start-Service ssh-agent
# 输入以下命令设置 `ssh-agent` 服务在启动时自动运行:
Set-Service -Name ssh-agent -StartupType Automatic
- linux 系统
eval "$(ssh-agent -s)"
将生成的 SSH 私钥添加到 ssh-agent
中:
# 1. windows系统
ssh-add F:\\reps\\ssh\\id_github
# 2.linux系统
ssh-add /home/user/.ssh/id_github
3. 将 SSH 公钥添加到 GitHub
- 复制生成的 SSH 公钥内容:
cat F:\\reps\\ssh\\github.pub
登录 GitHub 并添加公钥:
- 登录 GitHub。
- 点击右上角的头像,选择 Settings。
- 在左侧菜单中选择 SSH and GPG keys。
- 点击 New SSH key。
- 在 Title 字段中输入一个描述性名称(如“我的笔记本”)。
- 在 Key 字段中粘贴刚才复制的公钥。
- 点击 Add SSH key。
4. 验证连接
你可以通过以下命令来验证是否成功连接到 GitHub:
# 如果未添加 SSH 密钥到 ssh-agent,使用一下命令验证
ssh -T [email protected] -i F:\\reps\\ssh\\github
# 如果已添加 SSH 密钥到 ssh-agent,使用一下命令拉取
ssh -T [email protected]
如果一切正常,你会看到类似以下的输出:
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
5. 使用 SSH 连接到 GitHub 仓库
现在你可以使用 SSH 连接到你的 GitHub 仓库了。克隆仓库时,可以使用以下命令:
# 如果未添加 SSH 密钥到 ssh-agent,使用一下命令拉取
git clone [email protected]:username/repository.git --config core.sshCommand="ssh -i F:\\reps\\ssh\\github"
# 如果已添加 SSH 密钥到 ssh-agent,使用一下命令拉取
git clone [email protected]:username/repository.git
六. 常见的 Git 操作
1 初始化一个新的 Git 仓库
git init
2 添加文件到暂存区
git add .
3 提交更改
git commit -m "提交信息"
4 推送到远程仓库
git push origin main
5 拉取远程仓库的更改
git pull origin main
6 查看仓库状态
git status
7 查看提交历史
git log
总结
通过以上步骤,你已经成功生成了 SSH 密钥对,并配置了 Git 使用 SSH 连接到 GitHub 仓库。现在你可以使用 Git 进行各种操作,如克隆、推送和拉取代码。
其他有用的SSH命令
SSH端口转发
本地端口转发:
ssh -L local_port:remote_host:remote_port username@hostname
- 将本地端口转发到远程主机的指定端口。
远程端口转发:
ssh -R remote_port:local_host:local_port username@hostname
- 将远程主机的端口转发到本地主机的指定端口。
动态端口转发(用于SOCKS代理):
ssh -D local_port username@hostname
保持连接
防止SSH连接被闲置断开:
ServerAliveInterval 60
ServerAliveCountMax 3
- 在
~/.ssh/config
或/etc/ssh/ssh_config
中设置。
安全建议
- 禁用密码验证,只允许使用密钥对进行连接。
- 定期更换密钥对,确保安全性。
- 使用防火墙限制SSH访问,仅允许特定IP地址。
- 启用双因素认证(如果可能)。
- 监控登录尝试,使用
fail2ban
等工具防止暴力破解。
通过上述详细步骤,我们可以全面掌握SSH和OpenSSH的使用方法,并应用于服务器管理和GitHub操作。希望这些内容对大家有所帮助,我们下次分享见。