在 Windows 和 Linux 之间建立 SSH 连接

使用开源工具 PuTTY 建立从 Windows 机器到 Linux 系统的 SSH 连接。
83 位读者喜欢这篇文章。
clouds in windows

Opensource.com。CC BY-SA 4.0

安全外壳协议 (SSH) 是在 Linux 世界中通过命令行控制远程机器最常用的方法。SSH 是真正的 Linux 原创,并且在 Windows 世界中也越来越受欢迎。甚至有官方的 Windows 关于 SSH 的文档,其中涵盖了使用 OpenSSH 控制 Windows 机器。

本文介绍了如何使用流行的开源工具 PuTTY 建立从 Windows 机器到 Fedora 33 Linux 系统的 SSH 连接。

使用 SSH 的方法

SSH 使用客户端-服务器架构,其中 SSH 客户端建立与 SSH 服务器的连接。SSH 服务器通常作为系统守护进程运行,因此通常称为 SSHD。您几乎找不到不带 SSH 守护进程的 Linux 发行版。在 Fedora 33 中,SSH 守护进程已安装但未激活。

您可以使用 SSH 控制几乎任何 Linux 机器,无论它是在您的网络上作为虚拟机还是物理设备运行。一个常见的用例是嵌入式设备的无头配置,包括 Raspberry Pi。SSH 也可用于隧道传输其他网络服务。由于 SSH 流量已加密,因此您可以将 SSH 用作任何默认不提供加密的协议的传输层。

在本文中,我将解释使用 SSH 的四种方法:1. 如何在 Linux 端配置 SSH 守护进程,2. 如何设置远程控制台连接,3. 如何通过网络复制文件,以及 4. 如何通过 SSH 隧道传输特定协议。

1. 配置 SSHD

Linux 系统(在我的例子中是 Fedora 33)充当 SSH 服务器,允许 PuTTY SSH 客户端连接。首先,检查守护进程的 SSH 配置。配置文件位于 /etc/ssh/sshd_config,其中包含许多可以通过取消注释相关行来激活的开关

#	$OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Include /etc/ssh/sshd_config.d/*.conf

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

默认配置(未取消注释任何行)应该适用于此示例。通过键入 systemctl status sshd 检查 SSH 守护进程是否已在运行

$ systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-06-22 11:12:05 UTC; 2 years 11 months ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 577 (sshd)
    Tasks: 1 (limit: 26213)
   CGroup: /system.slice/sshd.service
           └─577 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-[...]

如果它处于非活动状态,请使用 systemctl start sshd 命令启动它。

2. 设置远程控制台

在 Windows 上,下载 PuTTY 安装程序,然后安装并打开它。您应该看到如下窗口

主机名(或 IP 地址)输入字段中,输入您的 Linux 系统的连接信息。在本例中,我设置了一个 Fedora 33 虚拟机,它带有一个桥接网络适配器,我可以使用 IP 地址 192.168.1.60 联系该系统。单击打开,应该会打开如下窗口

这是一种 SSH 安全机制,用于防止 中间人攻击。消息中的指纹应与 Linux 系统上 /etc/ssh/ssh_host_ed25519_key.pub. 中的密钥匹配。PuTTY 将密钥打印为 MD5 哈希。要检查其真实性,请切换到 Linux 系统,打开命令 shell,然后输入

ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub

输出应与 PuTTY 显示的指纹匹配

$ ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
256 MD5:E4:5F:01:05:D0:F7:DC:A6:32 no comment (ED25519)

单击确认 PuTTY 安全警报。主机系统的指纹现在位于 PuTTY 的信任列表中,该列表位于 Windows 注册表下的

HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys

输入正确的登录凭据,您应该在主目录中的控制台上

3. 通过网络复制文件

除了远程控制台,您还可以使用 PuTTY 通过 SSH 传输文件。在 C:\\Program Files (x86)\\PuTTY 下的安装文件夹中查找 pscp.exe。您可以使用它将文件复制到 Linux 系统和从 Linux 系统复制文件。

使用 Windows + R 打开命令提示符,然后输入 cmd。通过输入以下内容,将文件 MyFile.txt 从您的 Linux 用户主目录复制到您的 Windows 主目录

C:\"Program Files (x86)"\PuTTY\pscp.exe stephan@192.168.1.60:/home/stephan/MyFile.txt .

要将文件从 Windows 主目录复制到 Linux 用户主目录,请输入

C:\"Program Files (x86)"\PuTTY\pscp.exe MyFile.txt stephan@192.168.1.60:/home/stephan/

您可能已经弄清楚,复制命令的一般结构是

pscp.exe <source> <target>

4. 隧道传输协议

假设您有一台 Linux 机器正在为某些任意应用程序运行基于 HTTP 的服务。您想通过互联网从您的 Windows 机器访问此 HTTP 服务。当然,您不能将相关的 TCP 端口暴露给公众,因为

  1. 服务器正在运行 HTTP,而不是 HTTPS
  2. 根本没有用户管理或登录

乍一看,在不产生可怕的安全漏洞的情况下设置此架构似乎是一项不可能完成的任务。但是 SSH 使为这种情况设置安全解决方案变得相对容易。

我将用我的软件项目 Pythonic 来演示此过程。Pythonic 作为容器运行,公开两个 TCP 端口:TCP 端口 7000(主编辑器)和 TCP 端口 8000(code-server 源代码编辑器)。

要在 Linux 机器上安装 Pythonic,请运行

podman pull pythonicautomation/pythonic
podman run -d -p 7000:7000 -p 8000:8000 pythonic

切换到您的 Windows 机器,打开 PuTTY,然后导航到 Connection -> SSH -> Tunnels。添加您要转发的两个 TCP 端口

  • 源:7000 / 目标:localhost:7000
  • 源:8000 / 目标:localhost:8000

然后返回到会话部分,并像以前一样建立 SSH 连接。打开浏览器并导航到 http://localhost:7000;您应该看到如下屏幕

您已成功配置端口转发!

警告:如果您将 TCP 端口 22 暴露给公众,请不要使用容易猜测的登录凭据。您将收到来自世界各地的登录尝试,试图使用常见的标准凭据访问您的 Linux 机器。相反,只允许已知的客户端登录。可以使用 公钥密码术 实现此登录限制,该技术使用密钥对,其中公钥存储在 SSH 主机机器上,私钥保留在客户端。

调试

如果您在连接到 Linux 机器时遇到困难,可以使用以下命令跟踪 SSH 守护进程中的进程

journalctl -f -u sshd

以下是使用 LogLevel DEBUG 的普通登录过程的样子

了解更多

本文仅触及了使用 SSH 方法的表面。如果您正在寻找有关特定用例的信息,您可能会在互联网上大量的 SSH 教程中找到它。我在工作中大量使用 PuTTY,因为它易于配置且操作系统之间的良好互操作性使其成为连接解决方案的瑞士军刀工具。

接下来阅读什么
标签
User profile image.
Stephan 是一位技术爱好者,他欣赏开源对于事物工作原理的深刻见解。Stephan 在工业自动化软件的专有领域担任全职支持工程师。如果可能,他会从事基于 Python 的开源项目、撰写文章或驾驶摩托车。

评论已关闭。

Creative Commons 许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© 2025 open-source.net.cn. All rights reserved.