前言
FTP 在内网中使用没啥问题,但在公网中使用…… *赛博裸奔.MP4*。使用 SFTP / SCP 可有效规避此类问题。
SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络环境中安全地连接到远程计算机或服务器。
SSH 的主要特点包括:
1. 加密通信:SSH 使用强加密算法来保护数据传输,确保信息在传输过程中不被窃听或篡改。
2. 身份验证:SSH 支持多种身份验证方式,确保只有授权用户才能访问远程系统。
3. 数据完整性:SSH 会检查数据在传输过程中是否被篡改,确保数据的完整性。
4. 多功能性:除了远程登录,SSH 还支持端口转发(内网穿透)、文件传输(通过 SCP 或 SFTP)、远程命令执行等功能。
SSH 服务端(Windows PC)与客户端简易教程
- 1.1 SSH 服务端(Windows PC)配置
- 1.1.1 安装软件/功能
- 1.1.2 启动服务
- 1.1.3 免密登录(仅使用密钥登录)
- 1.1.3(1) 生成密钥对
- 1.1.3(2) 编辑配置文件
- 2.1 SSH 客户端配置-Windows
- 2.1.1 使用 CMD / Powershell 访问(1)
- 2.1.2 使用 CMD / Powershell 访问(2)
- 2.1.3 使用 WinSCP 访问
- 2.2 SSH 客户端配置-iOS
- 2.3 SSH 客户端配置-Android
- 2.3.1 使用 JuiceSSH 访问
- 2.3.2 使用 Termius 访问
- 3.1 FAQ
1.1 SSH 服务端(Windows PC)配置
1.1.1 安装软件/功能
注意:若 PC 中存在诸如 Windows Update Blocker(WUB) 等阻止 Windows 更新的软件,请临时将其关闭。
Windows 默认安装 OpenSSH 客户端,但 OpenSSH 服务器通常需手动安装。
在 Windows 10 中,打开“设置”,在搜索栏中输入“可选功能”,点击“管理可选功能”,点击“添加功能”,勾选“OpenSSH 服务器”并点击“安装”,耐心等待进度条达到 100%。

安装完毕后,打开 CMD 或 Windows Powershell,输入`ssh -V`并回车,若显示有 OpenSSH 的版本号,则说明安装成功。
Windows 11 中的操作步骤与其类似。
提示:可使用 Cygwin、MobaXterm 等作为替代方案。
1.1.2 启动服务
右键“此电脑”,点击“管理”,在“服务和应用程序 -> 服务”中,找到“OpenSSH Authentication Agent”和“OpenSSH SSH Server”,然后分别对这两项服务进行以下操作:
- 右键并点击“属性” / 双击;
- 将“启动类型”改为“自动”并点击“应用”;
- 右键并点击“启动” / 在页面左上角点击“启动此服务”。


在 Windows Powershell 中,输入`Get-Service -Name *ssh*`并回车,若显示有`ssh-agent`和`sshd`且其`Status`均为`Running`,则说明服务启动成功。
接着输入`netstat -an | findstr :22`并回车,若显示有`TCP 0.0.0.0:22 0.0.0.0:0 LISTENING`和`TCP [::]:22 [::]:0 LISTENING`,则说明 OpenSSH 服务器正在监听 22 端口(SSH 默认端口)。

1.1.3 免密登录(仅使用密钥登录)
虽说到这一步后即可使用 SSH 连接 PC,但使用密码登录的 SSH 并不安全。
1.1.3(1) 生成密钥对
在 Windows Powershell 中,输入以下其中一条命令生成密钥对:
- `ssh-keygen -t ed25519`:生成长度为 256 bit 的 Ed25519 密钥对。推荐使用这条命令;
- `ssh-keygen -b num -t ecdsa`:生成长度为 num bit 的 ECDSA 密钥对。此处 num 仅可为 256、384 或 521,若未输入`-b num`则生成长度为 256 bit 的 ECDSA 密钥对;
- `ssh-keygen -b num -t rsa`:生成长度为 num bit 的 RSA 密钥对。建议长度为 3072 bit 或更高(至少 1024 bit,至多 16384 bit,不同 SSH 服务端对 bit 的限制可能不同);
- `ssh-keygen`:生成长度为 3072 bit 的 RSA 密钥对。不同 SSH 服务端的默认生成选项可能不同,比如在 OpenSSH 9.5 之后的版本中输入此命令,将生成长度为 256 bit 的 Ed25519 密钥对。
在生成密钥对时,在“Enter file in which to save the key”这一行中,输入`文件夹路径\文件名(不带后缀)`后回车,若直接回车则将以`默认文件夹路径\id_xxx`的方式生成密钥对。以下是两种示例写法:
- 相对路径:`.ssh\keyfile_name`;
- 绝对路径(带盘符):`C:\Users\User_name\.ssh\keyfile_name`。
注意:最好使用半角双引号("")将路径括起来,以避免歧义。
在“Enter passphrase (empty for no passphrase)”这一行中,输入随机字符串后回车将为私钥设置一个 passphrase(密码),此后使用此私钥建立 SSH 连接前需要输入 passphrase。若直接回车则不会为私钥设置 passphrase。passphrase 的主要作用在于若客户端被入侵或私钥泄露,攻击者在不知道 passphrase 的情况下也无法通过此私钥访问对应服务端。
在“Enter same passphrase again”这一行中,输入先前设置的 passphrase,若未设置则直接回车。

1.1.3(2) 编辑配置文件
密钥对生成完毕后,将不带`.pub`后缀的私钥文件发送到客户端。随后使用记事本打开后缀为`.pub`的公钥文件,复制其中的字符串。然后前往此文件夹:“C:\Users\*用户名*\.ssh”,新建文本文档并命名为“authorized_keys”(不带后缀),使用记事本打开此文件并将先前复制的字符串粘贴进去,随后保存。
接着前往此文件夹:“C:\ProgramData\ssh”,使用记事本打开文件“sshd_config”(注意:请以管理员身份打开),取消以下内容的注释(删除“#”号):
- `PubkeyAuthentication yes`(第 34 行);
- `AuthorizedKeysFile .ssh/authorized_keys`(第 38 行);
- `PasswordAuthentication no`(第 51 行,若为“yes”请改为“no”)。
并注释掉以下内容(在开头添加“#”号):
- `Match Group administrators`(倒数第 2 行);
- ` AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys`(倒数第 1 行)。
随后保存。
右键“此电脑”,点击“管理”,在“服务和应用程序 -> 服务”中,找到“OpenSSH SSH Server”,右键此服务并点击“重新启动”。
2.1 客户端配置-Windows
2.1.1 使用 CMD / Windows Powershell 访问(1)
在 CMD 中,输入`ssh -i "私钥文件路径" username@ip(或域名)`并回车。首次连接时会弹出提示,此时先输入“yes”并回车,然后使用记事本打开此文件:“C:\Users\*用户名*\.ssh\known_hosts”,将其中的字符串与服务端中的公钥文件“C:\ProgramData\ssh\ssh_host_xxx_key.pub”(xxx 为此次连接使用的密钥加密算法)当中的字符串逐一比对(注意忽略“=”号后面的注释),若核对无误,则说明未遭遇中间人攻击,此次与后续的连接均可信。

输入`exit`并回车即可断开连接。
注意:在 Windows 中,微软账户用户名通常为邮箱,此时请使用半角双引号("")将用户名括起来以免用户名中的“@”与命令中的“@”混淆。
2.1.2 使用 CMD / Windows Powershell 访问(2)
每次连接服务端前都需要输入私钥文件路径略显麻烦,尤其是有多个 SSH 服务端时。其中一个解决办法为将 SSH 连接命令存储在`.bat`文件中以实现批量管理 SSH 连接。
新建文本文档并将后缀改为“.bat”,然后使用记事本打开此文件,输入`ssh -i "私钥文件路径" username@ip(或域名)`并保存。此后仅需双击打开此文件即可连接服务端。
2.1.3 使用 WinSCP 访问
CMD / Windows Powershell 主要用于远程命令执行。对于文件传输,可使用 WinSCP。
WinSCP 官网:https://winscp.net/eng/docs/lang:chs。
打开 WinSCP,在“登录”页面中,“主机名”填写服务端 IP 或域名,“端口号”若未特别设置过则填写 22,“用户名”填写服务端的微软账户用户名或本地账户用户名,“密码”留空。

然后点击“高级...”,在“SSH -> 验证 -> 密钥文件”中,点击右侧的三个点,选择私钥文件并点击“打开”(若找不到私钥文件,尝试将右下角的筛选条件由“PuTTY私钥文件(*.ppk)”改为“所有文件(*.*)”)。若私钥文件由 OpenSSH 生成,WinSCP 会提示需要将 OpenSSH 私钥转化为 PuTTY 格式,点击“确定”,将转换后的私钥文件保存,WinSCP 会自动识别此私钥文件的路径。随后点击“确定”退出高级站点设置。


接着点击“保存”,输入站点名称和文件夹名称并点击“确定”,即可保存站点配置。此后连接服务端时无需再输入主机名、用户名等。

最后点击“登录”。首次连接时会弹出警告,此时先将服务端中的公钥文件“C:\ProgramData\ssh\ssh_host_xxx_key.pub”(xxx 为此次连接使用的密钥加密算法)复制到客户端,在客户端中复制其中的字符串到剪贴板。然后在 WinSCP 的警告页面中,点击“接受”旁的箭头,点击“粘贴密钥”。

若显示内容不匹配,则说明可能遭遇中间人攻击、字符串复制错误或复制公钥文件时文件损坏等;若显示网络错误,点击“重新连接”即可正常连接。


连接成功后,可像使用文件资源管理器一样自由管理文件。
2.2 客户端配置-iOS
2.2.1 使用 Termius 访问
在 App Store 中,搜索“Termius”,找到“Termius: Terminal & SSH Client”并下载安装。

在 Termius 中,点击右上角“+”号,点击“New Host”。“Label”填写站点名称,“IP or Hostname”填写服务端 IP 地址或域名,启用“Use SSH”选项,Port 若未特别设置过则填写 22, “Username”填写服务端的微软账户用户名或本地账户用户名,“Password”留空。


点击“Key”,点击右上角“+”号,点击“Import Key”,选择存储在本地的私钥文件并打开,点击“Save”。选择导入的 Key,随后点击“Save”。

点击 Hosts 中的站点图标以连接。首次连接时会弹出警告,此时先点击“Continue”,然后点击左上角退出连接页面,在“Known Hosts”中点击对应的站点图标,将“Host Information”中的字符串与服务端中的公钥文件“C:\ProgramData\ssh\ssh_host_xxx_key.pub”(xxx 为此次连接使用的密钥加密算法)当中的字符串逐一比对(注意忽略“=”号后面的注释),若核对无误,则说明未遭遇中间人攻击,此次与后续的连接均可信。


输入`exit`并回车或点击页面正上方的叉号即可断开连接。
Termius 亦支持 SFTP 文件传输。

2.3 客户端配置-Android
2.3.1 使用 JuiceSSH 访问
JuiceSSH 官网 APK 下载页面:https://juicessh.com/changelog。
在 JuiceSSH 中,点击“Manage Connections”,点击右下角“+”号。“名称”填写站点名称,“类型”选择 SSH,“主机”填写服务端 IP 地址或域名,“端口/连接埠”若未特别设置过则填写 22。

在“身份”中,点击“新增...”。“使用者名称”填写服务端的微软账户用户名或本地账户用户名,“密码”无视,点击“私钥”并导入存储在本地的私钥文件,随后点击右上角的勾以新增身份。

点击右上角的勾以新增连接,随后点击站点图标以连接服务端。首次连接时会弹出警告,由于本作者暂未找到 JuiceSSH 查看 Known Host 的方法,请自行确认公钥指纹后点击“接受”或“拒绝”。
输入`exit`并回车即可断开连接。
2.3.2 使用 Termius 访问
Termius APK 下载:
操作步骤与章节 2.2.1 类似。
3.1 FAQ
- macOS 呢?
- 如何在公网中访问内网设备?
- 为什么不使用 SMB 访问 Windows PC?
参考资源