2655 字
13 分钟
OpenSSH核心操作
2024-11-28

一. SSH 和 OpenSSH 简介#

SSH(Secure Shell)#

SSH(Secure Shell)是一种用于安全访问远程计算机的网络协议。它提供了一种加密的方法来确保数据传输的安全性,从而防止网络攻击和数据窃取。SSH主要用于以下几个方面:

  1. 远程登录:通过SSH,可以安全地登录到远程计算机进行操作。
  2. 远程命令执行:可以在远程计算机上运行命令。
  3. 文件传输:通过SCP(Secure Copy Protocol)或SFTP(SSH File Transfer Protocol),可以安全地在本地和远程计算机之间传输文件。

SSH 的通信方式包括对数据进行加密,防止第三方窃听和篡改,从而提供了一种安全的通信通道。

SSH的基本工作原理#

  1. 客户端发起连接请求。
  2. 服务端响应请求,并发送其公钥。
  3. 客户端使用服务端的公钥对通信进行加密。
  4. 服务端使用其私钥解密通信内容,从而建立安全连接。

OpenSSH#

OpenSSH 是SSH协议的一个开源实现,由OpenBSD项目团队开发和维护。OpenSSH不仅实现了SSH协议的核心功能,还提供了许多额外的工具和功能,增强了SSH的使用体验和安全性。OpenSSH主要包括以下组件:

  1. ssh:用于连接到远程计算机的客户端程序。
  2. sshd:在远程计算机上运行的守护进程,处理来自客户端的连接请求。
  3. scp:用于安全地复制文件的工具。
  4. sftp:用于安全文件传输的工具,类似于FTP,但通过SSH进行加密。
  5. ssh-keygen:用于生成公钥和私钥对的工具。
  6. ssh-agentssh-add:用于管理和使用私钥的工具,简化了密钥管理。
  7. 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:指定密钥类型,常用值有rsadsaecdsaed25519等。
  • -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
  1. 禁用密码验证
PasswordAuthentication no
  1. 启用密钥对验证
PubkeyAuthentication yes
  1. 重启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 的使用步骤#
  1. 启动 SSH-Agent: 在大多数 Linux 和 macOS 系统中,ssh-agent 通常已经包含在默认的系统安装中。可以使用以下命令启动它:

    eval $(ssh-agent -s)
    

    这条命令会启动 ssh-agent 并将其进程 ID 输出到当前 Shell 环境变量中。

  2. 添加私钥到 SSH-Agent: 使用 ssh-add 命令将私钥添加到 ssh-agent 中。例如:

    ssh-add ~/.ssh/id_ed25519
    

    如果私钥文件使用了密码保护,则此时会提示输入密码。

  3. 查看加载的私钥: 可以使用 ssh-add -l 命令来查看当前 ssh-agent 中加载的私钥列表:

    ssh-add -l
    
  4. 删除私钥: 可以使用 ssh-add -d 命令删除特定的私钥,或者使用 ssh-add -D 命令删除所有加载的私钥:

    ssh-add -d ~/.ssh/id_rsa
    ssh-add -D
    
  5. 停止 SSH-Agent: 当不再需要 ssh-agent 时,可以使用以下命令停止它:

    eval $(ssh-agent -k)
    

2. SSH-Add#

ssh-add 是一个用于向 ssh-agent 添加私钥的命令。它可以将私钥添加到 ssh-agent 中,使得在使用 SSH 连接时无需重复输入密码。

SSH-Add 的常用命令#
  1. 添加私钥: 将指定的私钥文件添加到 ssh-agent 中:

    ssh-add ~/.ssh/id_rsa
    
  2. 查看加载的私钥: 显示当前 ssh-agent 中加载的私钥列表:

    ssh-add -l
    
  3. 删除私钥: 从 ssh-agent 中删除指定的私钥:

    ssh-add -d ~/.ssh/id_rsa
    
  4. 删除所有私钥: 从 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#

  1. 复制生成的 SSH 公钥内容
cat F:\\reps\\ssh\\github.pub
  1. 登录 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端口转发#

  1. 本地端口转发

    ssh -L local_port:remote_host:remote_port username@hostname
    
    • 将本地端口转发到远程主机的指定端口。
  2. 远程端口转发

    ssh -R remote_port:local_host:local_port username@hostname
    
    • 将远程主机的端口转发到本地主机的指定端口。
  3. 动态端口转发(用于SOCKS代理):

    ssh -D local_port username@hostname
    

保持连接#

防止SSH连接被闲置断开:

ServerAliveInterval 60
ServerAliveCountMax 3
  • ~/.ssh/config/etc/ssh/ssh_config中设置。

安全建议#

  1. 禁用密码验证,只允许使用密钥对进行连接。
  2. 定期更换密钥对,确保安全性。
  3. 使用防火墙限制SSH访问,仅允许特定IP地址。
  4. 启用双因素认证(如果可能)。
  5. 监控登录尝试,使用fail2ban等工具防止暴力破解。

通过上述详细步骤,我们可以全面掌握SSH和OpenSSH的使用方法,并应用于服务器管理和GitHub操作。希望这些内容对大家有所帮助,我们下次分享见。

OpenSSH核心操作
https://blog.2231258.xyz/posts/program/ssh/openssh核心操作/
作者
康十一
发布于
2024-11-28
许可协议
CC BY-NC-SA 4.0