当前位置:首页 > 技术 > 正文内容

SSH 命令与安全连接机制深入解析

访客 技术 2026年7月27日 3

非对称加密原理概述

在网络安全通信中,加密技术是保障数据传输安全的核心。常见的加密方式分为对称加密和非对称加密两类。

  • 对称加密:加密与解密使用相同的密钥,例如登录密码或银行卡PIN码。只要密钥正确即可完成加解密操作。
  • 非对称加密:采用一对密钥——公钥(public key)和私钥(private key)。公钥用于加密,对应的私钥用于解密;反之,私钥签名的数据可由公钥验证。典型应用包括SSL/TLS、SSH等协议。

以主机A和B为例,若各自生成密钥对并交换公钥,则可实现以下通信模式:

  1. A将数据用B的公钥加密后发送,B用自己的私钥解密。
  2. B将数据用A的公钥加密后发送,A用自己的私钥解密。

尽管理论上支持多种组合,但在SSH的身份认证流程中,标准做法是由客户端持有私钥,服务端保存来自多个客户端的公钥列表。出于安全性考虑,通常由客户端生成密钥对,并将其公钥上传至目标服务器。

SSH 协议基础架构

SSH(Secure Shell)是一种工作于传输层与应用层之间的安全协议,通过加密会话确保远程连接的安全性。主要特性如下:

  • 默认守护进程为 sshd,监听 TCP 22 端口。
  • 所有基于 SSH 的工具如 sshscpsftpssh-copy-id 都依赖于该连接机制。
  • 客户端读取两个配置文件:/etc/ssh/ssh_config(全局)和 ~/.ssh/config(用户级),优先级顺序为:命令行参数 > 用户配置 > 全局配置。
  • 包含两重验证机制:主机身份验证(host verification)和用户身份验证(user authentication)。
  • 支持多种认证方式,默认尝试顺序为:gssapi-with-mic, hostbased, , keyboard-interactive, password。其中最常用的是密码认证和公钥认证。
  • 具备高级功能,如端口转发、代理跳转、连接复用等。
  • 服务端主配置文件位于 /etc/ssh/sshd_config,需注意与客户端配置区分。
  • 每次登录时,SSH 默认请求分配一个伪终端(pseudo-terminal),某些权限管理程序(如 sudo)可能限制此行为导致连接失败。

SSH 认证流程详解

以从客户端 A (172.16.10.5) 连接服务端 B (172.16.10.6) 为例,整个过程分为两个阶段:

主机身份验证

首次连接时,系统检查本地 ~/.ssh/known_hosts/etc/ssh/known_hosts 是否已记录目标主机的公钥指纹(host key)。若无记录,则提示是否信任并保存:

The authenticity of host '172.16.10.6' can't be established.
RSA key fingerprint is f3:f8:e2:33:b4:b1:92:0d:5b:95:3b:97:d9:3a:f0:cf.
Are you sure you want to continue connecting (yes/no)?

该 host key 实际来源于服务端的 /etc/ssh/ssh_host_rsa_key.pub 文件。客户端通过比对收到的公钥与其本地缓存来判断主机是否可信。

为了提高效率,实际比较的是经过哈希处理后的"指纹"而非完整密钥。可通过以下命令查看指纹:

ssh-keygen -l -f ~/.ssh/known_hosts
# 输出示例:
# 2048 f3:f8:e2:33:b4:b1:92:0d:5b:95:3b:97:d9:3a:f0:cf 172.16.10.6 (RSA)

还可使用 -v 参数生成可视化指纹图案,便于人工识别:

ssh-keygen -lv -f /etc/ssh/ssh_host_rsa_key

用户身份验证

主机验证通过后进入用户认证阶段。常见方式有:

  • 公钥认证:客户端事先将其公钥(如 ~/.ssh/id_rsa.pub)写入服务端对应用户的 ~/.ssh/authorized_keys 文件。连接时,客户端声明所用密钥,并通过私钥证明身份。
  • 密码认证:输入远程账户密码进行验证。

认证顺序可通过客户端配置中的 PreferredAuthentications 指令调整,建议优先启用公钥认证以提升自动化能力。

会话建立

双重重验均通过后,根据命令形式决定后续动作:

  • 无附加命令时,启动交互式 shell,分配伪终端。
  • 指定命令则执行完毕即退出,不进入 shell 环境。

此外,可在远程主机上设置 ~/.ssh/rc/etc/ssh/rc,这些脚本将在每次成功连接后第一时间执行。

关键文件分布说明

角色路径用途
服务端 (B) /etc/ssh/sshd_config SSH 服务配置文件
/etc/ssh/ssh_host_* 服务端密钥对,启动时生成,私钥权限必须为 600
~/.ssh/authorized_keys 存储允许登录的客户端公钥
/etc/ssh/ssh_known_hosts 全局主机公钥数据库(较少使用)
/etc/ssh/rc 连接成功后执行的系统级脚本
客户端 (A) /etc/ssh/ssh_config 全局客户端配置
~/.ssh/config 用户专属配置,优先级更高,需严格权限控制
~/.ssh/known_hosts 本地保存的远程主机公钥指纹
~/.ssh/id_rsa 用户私钥文件,其他用户不可读,否则会被忽略
~/.ssh/id_rsa.pub 对应公钥,权限宽松
~/.ssh/rc 本地响应远程连接事件的脚本

核心配置项说明

服务端配置 (/etc/ssh/sshd_config)

# Port 22                   # 自定义监听端口
Protocol 2                  # 强制使用更安全的 SSH-2 协议
HostKey /etc/ssh/ssh_host_rsa_key  # RSA 密钥位置
PermitRootLogin no          # 禁止 root 直接登录(推荐)
PubkeyAuthentication yes    # 启用公钥认证
PasswordAuthentication yes  # 是否允许密码登录
UseDNS no                   # 关闭反向 DNS 查询,加快连接速度
MaxStartups 10              # 最大未认证并发连接数
DenyUsers user1 user2       # 拒绝特定用户访问
GatewayPorts no             # 控制远程端口转发绑定地址范围

客户端配置 (/etc/ssh/ssh_config 或 ~/.ssh/config)

Host *
    GSSAPIAuthentication no     # 关闭较慢的 GSSAPI 认证
    StrictHostKeyChecking ask   # 控制未知主机处理策略
                              # yes: 拒绝 | ask: 提示 | no: 自动添加
    IdentityFile ~/.ssh/id_rsa  # 指定默认私钥路径
    Port 22                     # 默认连接端口
    VisualHostKey no            # 是否显示图形化指纹

常用命令与实用技巧

基本语法

ssh [options] [user@]hostname [command]

常用选项:

  • -i identity_file:指定私钥文件
  • -p port:指定非标准端口
  • -o Option=Value:临时覆盖配置项
  • -t:强制分配终端(常用于需交互的远程命令)
  • -f:后台运行(隐含 -n
  • -N:仅建立隧道,不执行远程命令
  • -v:详细输出,调试连接问题

跨主机跳转示例

当 A 可连 B,B 可连 C,但 A 无法直连 C 时,可通过中间节点跳转:

ssh user@172.16.10.6     # 登录跳板机
ssh user@172.16.10.3      # 再从跳板机登录目标

数据传输与管道操作

利用 SSH 建立的安全通道进行高效数据流转:

# 将本地目录压缩传送到远程并解压
tar cz /local/path | ssh user@remote "cd /remote/dir && tar xz"

# 从远程打包下载到本地
ssh user@remote "tar cz /remote/path" | tar xz

# 手动模拟 ssh-copy-id 功能
cat ~/.ssh/id_rsa.pub | ssh user@remote "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys"

SCP 文件复制机制分析

scp 是基于 SSH 的文件拷贝工具,语法简洁且资源占用低:

scp [options] source target

支持四种模式:

  • 本地 → 本地
  • 本地 → 远程
  • 远程 → 本地
  • 远程 → 远程

远程间复制的实际流程是:本地发起命令,将任务委托给源主机,由其主动连接目标主机完成传输。因此,中间主机必须能访问最终目的地。

若普通方式失败,可尝试:

# 显式开启终端分配
ssh -tt middle_host "scp source_file dest_host:path"

# 使用 -3 选项让流量经本地中转
scp -3 user1@host1:/file user2@host2:/dest

实现免密登录(公钥认证)

标准流程

  1. 生成密钥对
  2. ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""
    
  3. 上传公钥
  4. ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host
    

    若服务端使用非标准端口:

    ssh-copy-id "-p 2222 user@remote_host"
    

替代方案:服务端分发私钥

虽然不推荐,但也可反向操作:

  1. 在服务端生成密钥对。
  2. 将公钥加入自身 authorized_keys
  3. 通过 scp 将私钥文件传至客户端 ~/.ssh/id_rsa
  4. 确保客户端拥有匹配的公钥文件或删除之以避免配对校验失败。

自动化批量部署方案

使用 ssh-keyscan + sshpass

适用于大规模环境初始化:

# 生成本地密钥
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa

# 批量预注册主机指纹并推送公钥
for ip in 192.168.100.{23..33}; do
    ssh-keyscan "$ip" >> ~/.ssh/known_hosts 2>/dev/null
    sshpass -p 'your_password' ssh-copy-id "root@$ip" >/dev/null 2>&1
done

使用 expect 实现全自动交互

安装 expect 工具:

yum install -y expect

编写自动应答脚本(示例:scp 自动化):

#!/usr/bin/expect
set timeout 30
set src [lindex $argv 0]
set dst [lindex $argv 1]
set pass [lindex $argv 2]

spawn scp $src $dst
expect {
    "*yes/no*" { send "yes\r"; exp_continue }
    "*assword:*" { send "$pass\r" }
}
expect eof

调用方式:

./autoscp.exp /etc/fstab user@172.16.10.6:/tmp mypass123

常见性能问题及优化

连接缓慢通常发生在两个阶段:

  • 主机验证阶段卡顿:多因 DNS 解析延迟引起。解决方法是在服务端配置中设置 UseDNS no
  • 身份验证阶段卡顿:默认认证链中 gssapi-with-mic 可能较慢。可在客户端配置中禁用或调整顺序:
GSSAPIAuthentication no
PreferredAuthentications publickey,password

调试技巧:使用 ssh -vvv 查看详细握手过程,定位瓶颈所在。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。