SSH客户端软件驻留在用户的工作站上,并允许连接到SSH服务器。本书讨论两个常见的客户端:用于类Unix主机的OpenSSH命令行客户端 ssh(1) 和用于MS Windows的PuTTY客户端。这两个客户端都可以以源代码或二进制形式自由使用和重新分发,限制和约束非常小。
当然,人们已经编写了其他SSH客户端。您可以通过Cygwin或Windows 10及更高版本上的Microsoft Windows Subsystem for Linux获得基于OpenSSH的Windows系统客户端。OpenSSH可以直接移植到Windows(https://github.com/PowerShell/Win32-OpenSSH)。微软已经发布了OpenSSH到Windows 10及更高版本的测试版,作为开发人员功能。同样,PuTTY已被移植到许多类Unix系统和移动设备上。许多人已经分叉了PuTTY和OpenSSH,对其进行了修改以满足他们的需求。其中许多都是可靠、可靠的项目。一旦你对SSH有了扎实的基础,就可以随意使用你喜欢的客户端。
本章中,每个客户都有自己的部分。涉及SSH客户端的更多章节将分为三个部分:一个部分介绍我们正在做什么的理论,然后是关于配置每个客户端的单独部分。
第五章:SSH客户端OpenSSH 客户端OpenSSH 客户端配置每台主机配置规范主机名常见 SSH 选项更改用户名更改端口SSH 命令行选项评估你的SSH设置SSH 跳转主机地址选项IP 协议版本设置源地址OpenSSH主机密钥缓存密钥缓存缓存安全: 哈希known_hostsPuTTY 客户端设置PuTTY 默认值使用PuTTY启动SSH会话保存PuTTY 连接PuTTY 管理PuTTY 复制粘贴PuTTY 配置PuTTY 排错更改实时PuTTY 会话复用连接配置复用复用风险SSH 压缩
OpenSSH客户端 ssh 与OpenSSH服务器同步开发。由于新功能通常在OpenSSH中先于其他SSH实现出现,因此使用最新的OpenSSH客户端可以获得SSH功能的最前沿。OpenSSH客户端是作为OpenBSD的一部分开发的,但每六个月就会出现一个新的可移植版本。
用户的个人SSH设置记录为 $HOME/.ssh/ 中的文件。与主目录一样,此目录必须只能由用户和root写入,尽管你可以允许它具有全球可读性。如果其他人可以写入此目录,则各种客户端和服务器的功能将停止工作。当 ssh 创建具有正确权限的 $HOME/.ssh 时,如果你的SSH套件行为异常,请检查权限。
ssh 的运行方式是,输入命令,然后输入要连接的主机:
$ ssh gluttony.mwl.io这将使用客户端的默认设置连接到主机 gluttony.mwl.io ,包括你当前的用户名。
【但请使用您的主机之一。如果你连接到我的,我可能会在社交媒体上发布你的用户名、IP和密码。】
如果 ssh 的行为不符合预期,可尝试使用 -v 在详细模式下运行它。你将看到:服务器和客户端协商协议版本和加密算法,服务器提供其主机密钥,客户端验证该密钥,以及两种协商身份验证方法。虽然这可能无法解决你的问题,但它会告诉你登录失败的位置,并提示你在哪里查找。仔细阅读输出可能会告诉你,例如,服务器只允许使用公钥登录,或者你在试图使用不受支持的加密方法。
xxxxxxxxxx$ ssh -v gluttony.mwl.io如果仍然有问题,多个 -v 选项可以提高调试级别。
在正常情况下,就是这样。本书的其余部分是关于异常情况的。
通过在命令行或配置文件中设置选项来配置 ssh 。使用配置文件进行永久更改,使用命令行进行临时更改。我们先看看配置文件。
两个文件控制 ssh(1) 行为:/etc/ssh/ssh_config 和 $HOME/.ssh/config 。这两个文件都包含关键字和值,如第2章所述。前者为所有系统用户建立默认行为。后者是用户的个人SSH客户端配置。用户的配置会覆盖所有全局设置,但大多数用户不会费心输入自己的自定义配置。配置文件更改会影响更改后启动的所有SSH会话。没有重启的过程,但更改配置不会影响现有的SSH会话。这两个文件具有相同的语法,并接受完全相同的选项。为了简洁起见,我们将参考 ssh_config ,但所有内容都同样适用于 $HOME/.ssh/config 。
虽然大多数连接选项都可以在命令行上设置,但我们建议将悠久信息存储在 ssh_config 中。 scp(1) 和 sftp(1) 等程序读取 ssh_config ,每个程序的命令行选项略有不同。使用配置文件可以集中配置。
用户的个人配置会覆盖全局配置。在命令行上设置的选项会覆盖这两个选项。
使用 Host 关键字可以更改 ssh 连接到某些主机的方式。使用 Port 关键字可以更改 ssh 连接到的TCP端口,但仅适用于 mwl.io 域中的主机。它将端口22用于所有其他主机,如 /etc/services 中指定的。
xxxxxxxxxxHost *.mwl.ioPort 2222也可以指定一个IP地址或IP地址网络:
xxxxxxxxxxHost 192.0.2.*Port 2224注意,ssh 根据用户在命令行上输入的内容匹配这些 ssh_config 条目。Host 条目必须与用户键入的内容完全匹配,区分大小写。假设我的 ssh_config 包含上述两个 Host 条目,让我们看看这在实践中是如何工作的:
xxxxxxxxxx$ ssh gluttony.mwl.io这条命令匹配第一个 Host 条目,所以 ssh连接到端口2222。
我的桌面的 /etc/resolv.conf 会自动将域 mwl.io 附加到任何单独的主机名上,所以我可能不会键入完全限定的域名(FQDN)。相反,我会输入以下命令:
xxxxxxxxxx$ ssh gluttony以上命令与第一条 Host 条目不匹配,因为没有明确键入 ssh_config 中给出的域名。但是,如果 gluttony 主机的IP地址在192.0.2.0/24中,那么第二个 Host 条目会匹配吗?不会,因为 Host 条目在命令行上匹配;没有针对DNS的检查。为了根据Host条目中的IP地址匹配,我需要显式运行 ssh 192.0.2.whatever 。此主机的自定义设置需要以下 Host 条目:
xxxxxxxxxxHost gluttonyPort 2222在第一次匹配的基础上解析条件。 Host 条目后列出的配置选项将一直有效,直到下一个主机条目。这个 ssh_config 可能是错误的:
xxxxxxxxxxHost *.mwl.ioHost 192.0.2.*Port 2222用户可能希望 Port 关键字应用于 mwl.io 中的所有主机和 192.0.2.0/24 中的所有IP地址。我们在 mwl.io 域中为任何主机都有一个条目,但没有进行特殊配置。 192.0.2.0/24 中的任何主机都在端口2222上运行sshd。与其这样做,不如在同一行上列出多个主机,用空格分隔。例如:
xxxxxxxxxxHost 129.0.2.* mwl.io *.mwl.io gluttony avarice lust pride wrath envy slothPort 2222我列出了 *.mwl.io 和 mwl.io ,因为有一台名为 mwl.io 的特定计算机,域名前的星号和句点将与该主机不匹配。
将所有全局默认值放在配置文件的开头。假设你的组织有一个在端口981上运行SSH的策略,因为他们喜欢通过隐藏来实现安全性,但你的特殊服务器使用不同的端口来实现更多的隐藏:
xxxxxxxxxxPort 981Host *.mwl.ioPort 2222这里的默认端口是981,但指定的主机使用端口2222。
有时,你希望在不干扰工作配置的情况下测试更改,或者你可能有一个需要特殊配置文件的自动化过程。要使用 ssh_config 以外的配置文件,可在命令行中使用 -F 选项指定它:
xxxxxxxxxx$ ssh -F test-config avarice现在,您可以在不破坏工作配置的情况下尝试功能。
如果你有足够的主机,你可以考虑在 ssh_config 中建立规范的主机名。
canonicalize——规范化
在足够大的网络上,或者在服务器动态创建和销毁的编排环境中,列出所有SSH服务器很快就变得不切实际。CanonicalizeHostname 关键字告诉 ssh 将 ssh_config 中的独立 Host 条目重写到特定域中,然后(如果存在)使用该主机名进行配置和密钥管理。这使你可以消除许多冗长的 Host 关键字。将 CanonicalizeHostname 设置为 yes ,将 CanonicalDomains 设置为你的域,参考以下配置:
xxxxxxxxxxCanonicalizeHostname yesCanonicalDomains mwl.ioHost *.mwl.ioPort 2222下次我运行 ssh gluttony ,ssh 会检查是否有 gluttony.mwl.io 。如果该主机名存在,ssh 会像运行 ssh gluttony.mwl.io 一样套用 ssh_config 中的配置。此连接将会获取适用于 mwl.io 域中主机的特殊规则。
你可以列出多个规范域。按照列出的顺序测试规范名称,第一场比赛获胜。参考以下条目:
xxxxxxxxxxCanonicalDomains mwl.io michaelwlucas.com当我运行 ssh wrath 时,ssh(1) 会搜索 wrath.mwl.io ,如果找到该主机,它将打开一个连接。如果找不到,ssh 会继续搜索下一个 wrath.michaelwlucas.com 。
如果你激活主机名规范化(canonicalization),ssh 默认会尝试对包含一个或更少点(fewer dots)的主机进行规范化。这使得规范化捕获子域,例如 www.detroit.mwl.io 对应的 www.detroit 。要更改主机名中的最大点数,请使用 CanonicalizeMaxDots 关键字。下面示例允许零个或更少的点:
xxxxxxxxxxCanonicalizeMaxDots 0OpenSSH还有其他一些主机名规范化特性,参阅 ssh_confg(5) 手册页。
人们使用的最常见功能是更改用户名、端口或添加SSH选项。
大多数SSH客户端假设您的用户名在客户端和服务器上都是相同的,并尝试使用您在本地计算机上的相同用户名登录远程系统。在我的大多数系统上,我的用户名是 mwl 。偶尔会有人用不同的用户名为我创建一个帐户,比如 mlucas 、lucas、michael 或 jerkface。我必须告诉 ssh 在远程系统上使用该用户名。通过输入用户帐户名,后跟 @ 符号,然后是远程计算机名来完成此操作。
xxxxxxxxxx$ ssh jerkface@devio.us也可以使用 -l 指定用户名:
xxxxxxxxxx$ ssh -l jerkface devio.us对于上述情况,可以在 ssh_config 中使用 User 关键字指定用户名:
xxxxxxxxxxHost devio.usUser jerkface通过将用户名存储在 ssh_config 中,我可以忘记它们,释放宝贵的大脑空间。
一些站点在22以外的端口上运行SSH,通常是为了提供更高的安全性(这样做通常不能保护SSH,但确实可以降低日志噪声)。使用 -p 和端口号更改 ssh 连接到的端口。如果您的服务器在端口2222上运行 sshd ,请连接:
xxxxxxxxxx$ ssh -p 2222 gluttony你可以在 ssh_config 中指定端口:
xxxxxxxxxxPort 2222再一次,我建议将永久连接信息存储在 ssh_config 中。
SSH不仅仅是一个命令,这是一个协议。该协议有各种边缘情况。有时,你需要在命令行上设置一些边线。虽然OpenSSH支持的所有内容都可以作为 ssh_config 关键字获得,但并非所有这些关键字都有命令行等效项。要在命令行设置这些关键字,请使用 -o 命令行选项、选项名称、等号和该关键字的值:
xxxxxxxxxx$ ssh -o Port=2222 sloth这个例子很简单—— Port 关键字有一个专用的命令行选项 -p 。稍后会有更复杂的例子。
你可以设置命令行选项、用户配置文件中的选项和全局客户端配置文件的选项。Host 关键字可能会破坏你精心调整的默认值,或者你精心调整后的默认值可能要求你为特定服务器使用 Host 关键字。当你连接到主机时,你如何知道 ssh(1) 实际使用了哪些选项?
使用 -G 选项运行 ssh ,它告诉 ssh(1) 解析目标主机的所有配置,打印出要使用的配置,然后立即退出而不进行连接。你可以查看你的设置,以验证你是否获得了所需的内容。
系统管理员经常需要从一台主机连接到另一台主机。也许你信任这个中间主机,也许不信任。OpenSSH支持跳转主机(jump hosts),允许你使用SSH服务器作为中继连接到第二台服务器。是的,你可以通过登录到中间主机然后再次运行 ssh 来手动完成此操作,但使用内置支持意味着跳转主机看不到你的纯文本。跳转主机无法控制客户端和目标服务器协商的选项。这意味着你可以通过一个不接受任何一个的跳转主机转发X或你的SSH代理。
使用 -J 指定跳转主机。如果需要,可以添加用户名:
xxxxxxxxxx$ ssh -J mwl@envy jerkface@pride我试图以 jerkface 登录 pride ,使用 mwl 帐户借用 envy 主机作为跳转主机。
【ssh -J [跳板机] [目标机]】
系统将提示我输入跳转主机上的身份验证凭据,然后输入目标上的凭据。最好在两台主机上都使用公钥身份验证。
在 ssh_config中 使用P roxyJump 关键字设置跳转主机:
xxxxxxxxxxHost pride.mwl.ioProxyJump mwl@envy.mwl.io你有多信任跳转机?你的所有按键(keystrokes)都不会到达跳转机,因此你不必担心会话日志记录。跳转机可以更改或中断加密流,但这正是SSH旨在检测的篡改类型。
一些Linux发行版在其客户端中禁用跳转主机。
OpenSSH客户端运行你通过设置地址族和源地址来选择它如何使用TCP/IP。
主机可以同时同时拥有IPv4和IPv6地址。AddressFamily 关键字告诉客户端仅使用IPv4(inet)或仅连接IPv6(inet6)。默认值是 any ,这意味着“通过系统解析器返回地址的任何协议进行连接”。有时,通过一种协议或另一种协议,您将获得更好的连接。如果您通过隧道获得IPv6连接,那么仅使用IPv4进行SSH可能是有意义的。同样,如果你有无限的IPv6连接,你可能想对所有事情都使用IPv6。在这里,我故意禁用IPv4。
xxxxxxxxxxAddressFamily inet6你可以通过命令行选项 -4 选择仅使用IPv4:
xxxxxxxxxx$ ssh -4 lust使用 -6 强制使用IPv6。
在单个接口上具有多个IP地址的主机默认从该接口的主IP地址发起所有连接。这并不总是可取的。服务可以从一个主机迁移到另一个主机,通常不受任何防火墙更改的影响。您可以在 ssh_config 中使用 BindAddress 关键字告诉 ssh 使用主IP地址以外的源IP地址:
xxxxxxxxxxBindAddress 192.0.2.9BindAddress 必须附加到本地计算机。
BindAddress 没有方便的命令行标志。您必须用 -o 指定它。
OpenSSH客户端在 $HOME/.ssh/known_hosts 中记录用户批准的主机密钥。每个密钥都出现在 known_hosts 中自己的行上,就像这样:
xxxxxxxxxxwrath.mwl.io ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbm…每一行都包含机器的主机名(wrath.mwl.io)、主机密钥类型(ecdsa-sha2-nistp256)和公钥本身。
你打算如何更新密钥缓存?在某些环境中,用户必须手动验证主机密钥,然后手动将其添加的哦密钥缓存中。在其他环境中,自动向缓存添加新密钥是可以接受的。最常见的情况是,用户希望 ssh 询问他们该做什么。ssh_config 的 StrictHostKeyChecking 选项告诉 ssh 如何处理新的主机密钥。
将 StrictHostKeyChecking 设置为 yes ,ssh 将拒绝所有在 known_hosts 中没有条目的主机。客户端连接的唯一方法是将主机密钥手动添加到 known_hosts 中。在主机密钥自动分发的环境中,这是最有意义的。
如果你处于相反的极端,并且无论主机密钥有多重要,你都永远不会验证它,那么你最好将 StrictHostKeyChecking 设置为 accept-new 。这告诉 ssh 用它得到的每个新密钥盲目地更新 known_hosts 。这相当于从不费心锁你的家、车、办公室和银行金库——这可能会让你感到通风和自由,但迟早会有人对你的个人物品采取不文明的自由。
默认设置 ask 告诉 ssh 提供任何未知密钥,并询问用户要做什么。您可以验证密钥,接受密钥,并让 ssh 将其添加到 known_hosts ,或者拒绝主机密钥。
选择最适合您环境的选项。你的笔记本电脑可能与美国国家安全局或犯罪集团运行的服务器有不同的需求,所有这些都与你测试实验室中的编排系统不同。
known_hosts 文件对于闯入你桌面的入侵者来说非常方便;这是一个方便的SSH服务器目标列表。由于你的SSH服务器可能共享一个共同的系统管理员,因此用于渗透桌面的技术可能适用于任何这些服务器。此外,系统管理员和其他用户可以查看 known_hosts 的内容。防止窥探的最佳方法是更改 known_hosts ,使其不再包含主机名列表。通过哈希主机名来实现这一点,就像 /etc/passwd 对密码做的那样。
如果用哈希替换主机名,则没有人可以从文件中读取主机名,也没有人可以反向计算主机名。然而,当你连接到主机时,ssh 可以轻松计算服务器主机名的哈希值,并在 known_hosts 中查找该哈希值。
一个哈希过的 known_hosts 条目看起像这样:
xxxxxxxxxx|1|PBM07JCRBjfg8qOz1BokTtCDly0=|DVXu0IFq/dC4GMfbEbfVkhptVjQ= ecdsa-sha2-nistp256 AAAAE2VjZ…如果你检查条目,你会在下面看到密钥算法和主机密钥指纹。
要让 ssh 自动对添加到 known_hosts 的新主机密钥进行哈希运算,可以使用 ssh_config 关键字 HashKnownHosts :
xxxxxxxxxxHashKnownHosts yes然而,这不会对现有条目进行哈希运算。可以使用 ssh-keygen(1) 命令的 -H 选项对现有的 known_hosts 条目进行哈希运算:
xxxxxxxxxx$ ssh-keygen -H/home/mwlucas/.ssh/known_hosts updated.Original contents retained as /home/mwlucas/.ssh/known_hosts.oldWARNING: /home/mwlucas/.ssh/known_hosts.old contains unhashed entriesDelete this file to ensure privacy of hostnames哈希你的 known_hosts 会将现有的缓存复制到 known_hosts.old ,然后哈希 known_hosts 中的所有内容。验证 ssh 是否仍然可以连接到所有常用主机。一旦你确信你的密钥缓存仍然可用,就删除未哈希的 known_hosts.old 文件。
要在哈希 known_hosts 文件中查找单个主机条目,请使用 ssh-keygen -F 和目标主机名:
xxxxxxxxxx$ ssh-keygen -F avarice.mwl.io# Host avarice.mwl.io found: line 17|1|5hcRwDHWxwxCWrFTngG4jT4OhJ0=|TyJXB6z+oEJXSP5MzakulFWgPDI= ecdsa-sha2-nistp256…现在您知道此条目位于文件的第17行,并且可以轻松复制它。
要删除哈希主机名,请使用 ssh-keygen -R :
xxxxxxxxxx$ ssh-keygen -R avarice.mwl.io# Host avarice.mwl.io found: line 17/home/mwlucas/.ssh/known_hosts updated.Original contents retained as /home/mwlucas/.ssh/known_hosts.old如果你没有删除未哈希的 known_hosts.old ,那么它现在就不见了。
当从中央系统分发 known_hosts 时(【第11章】),没有理由不提供哈希版本。
PuTTY是一个SSH、telnet和串行客户端,也是一个终端模拟器,适用于Windows和类Unix系统。它可以在https://www.chiark.greenend.org.uk/~sgtatham/puty/latest.html,或者在网络上搜索“putty SSH”,你就能找到它。虽然它不是由OpenBSD团队中的专业偏执狂编写的,但PuTTY的免费源代码已经过反复审核。PuTTY可能是部署最广泛的Windows SSH软件。
PuTTY下载页面提供了多种选择。我推荐包含PuTTY及其所有相关程序的完整安装程序。你不需要所有东西,但它比单独下载各种实用程序更容易、更快。PuTTY真的不需要安装程序;如果你愿意,可以下载普通的 PuTTY.exe 。安装程序确实会在“开始”菜单中创建快捷方式,在操作系统中注册程序,并处理所有其他Windows细节。
PuTTY可以在命令行上运行。参数和命令行标志与OpenSSH非常相似。不过,如果你运行的是Windows,你可能会对PuTTY作为图形程序感兴趣。我们将重点介绍尖头点击界面,但您应该知道,如果需要,命令行是一个选项。
如果你喜欢冒险,你可以下载PuTTY开发快照。这包括PuTTY的所有最新补丁和功能,但它也可能包含全新的错误。
启动PuTTY,您将看到如图5-1所示的屏幕。

putty主界面的右侧,您将配置到不同服务器的连接。我们现在只有一个连接,Default Settings 。它不会连接到任何东西,但您将使用它来设置PuTTY默认值。您始终可以通过点击左侧的 Session 返回此屏幕。
在左侧,您可以配置PuTTY如何呈现自己以及如何处理支持的协议的选项。PuTTY支持多种协议。如果你需要一个灵活的通用终端模拟器,PuTTY可能可以满足你的需求。不过,我们只会介绍SSH。请注意SSH选项,从底部起第二个。点击此处,或展开那个小“加号”+ ,查看和编辑PuTTY如何执行SSH的详细信息。
如果您在左侧选择了某些内容,右侧将更改以显示所选选项的详细信息。选择 SSH ,右侧将显示一些基本协议选项,例如协议版本和共享SSH连接(请参阅本章后面的“连接多路复用”)。
我们将使用这些设置来建立PuTTY默认值。
您的新PuTTY安装只列出了一个连接,即 Default Settings 。您创建的每个新连接都是从复制默认设置中的所有内容开始的。单击 Default Settings 连接,然后单击 Load 。然后,您可以编辑并保存默认设置连接。
首先设置默认用户名。我在工作系统上的帐户都有相同的用户名。我的用户名唯一一次变化是当它是外部系统上的帐户时。我可以在PuTTY中设置我的默认用户名,并将其预先配置为我最常用的设置。在左侧,选择 Connection 。在 auto-login username 下,我输入了我的标准用户名。
现在回到会话面板。选择 Default Settings ,然后点击 Save 。您已更新默认连接。重复该过程以对默认值进行进一步更改。
在会话PuTTY屏幕中,转到 Host Name (or IP Address) 。输入SSH服务器的主机名或IP地址。如果需要,您也可以在此处更改端口号。单击窗口底部的 Open 。
PuTTY配置窗口将消失,取而代之的是黑色终端窗口。
您可以预先配置PuTTY连接,确保您与特定主机的会话每次都以相同的方式进行。在 Host Name (or IP Address) 下输入SSH服务器的主机名。在 Saved Sessions 下,键入此连接的名称。我通常以主机命名我的连接,可能还会加上一两个单词来表示会话中的任何特殊配置。我可能有一个标记为 dns1 的连接,还有一个名为 dns1 with X 的连接,这样我就可以在需要时轻松使用X转发。
要运行已保存的连接,请双击连接名称。
要复制已保存的连接,请突出显示它,单击 Load ,进行更改,然后用其他名称保存。
您将在运行PuTTY会话的工作的左上角看到一个PuTTY图标。这将导致一个有用任务的下拉菜单。
要复制现有会话,请打开同一主机的第二个窗口,选择 Duplicate Session 。
要为已保存配置的主机打开新窗口,请选择 Saved Sessions 和会话名称。
要打开一个全新主机的窗口,请选择 New Session 。
PuTTY不使用标准的Windows剪切和粘贴快捷方式。它的工作方式更像UNIX风格的X终端。要在PuTTY窗口中复制文本,请用鼠标将其高亮显示。要将文本粘贴到PuTTY窗口中,请单击鼠标右键。您也可以使用 SHIFT-INSERT 。
PuTTY将其配置和主机密钥缓存存储在Windows的注册表中:
[HKEY_CURRENT_USER\SOFTWARE\SimonTatham]
要将PuTTY配置从一个主机移动到另一个主机,可以将注册表的这部分复制到新主机。有些人甚至使用这些注册表设置通过Active Directory向用户分发有效的PuTTY配置。
PuTTY有两个调试工具:事件日志和会话日志。
您可以更改现有PuTTY会话中的一些设置。用户名和加密信息在登录时设置,但您可以更改日志记录、终端行为和隧道设置。
转到现有PuTTY会话的左上角,然后单击PuTTY图标。从下拉菜单中,选择 Change Settings 。这将打开一个简化的 New Session 窗口,仅显示您可以更改的选项。一旦你进行了编辑,并确认会话按照你想要的方式工作,你就可以保存会话,要么覆盖现有名称,要么选择一个新名称。
SSH会话可能需要很长时间才能打开,特别是如果SSH服务器找不到客户端IP地址的反向DNS条目。或者,您可能有一个幼稚的防火墙,限制了网段之间同时连接的数量。也许其中一台机器太旧了,初始密钥交换需要几秒钟的时间。SSH支持这些情况下的连接多路复用,允许您在一个TCP连接上运行多个SSH会话。虽然这并不能消除第一次连接的延迟,但额外的会话开始得更快。
PuTTY默认支持并使用连接多路复用。OpenSSH可以多路复用连接,但需要额外的配置。
OpenSSH的 ssh 客户端使用UNIX套接字来管理多路连接。用户必须为套接字创建一个目录并设置权限,以便只有她可以读取它们。
xxxxxxxxxx$ cd $HOME/.ssh$ mkdir sockets$ chmod 700 sockets/你现在可以在 ssh_config 中启用复用:
xxxxxxxxxxControlMaster autoControlPath ~/.ssh/sockets/%r@%h:%pControlMaster 设置告诉 ssh 尝试使用连接多路复用,但如果多路复用失败,则返回到单独的TCP连接。这允许您默认启用多路复用,但仍可以连接到非OpenSSH服务器。
ControlPath 告诉 ssh 在哪里可以找到多路复用管理文件。此语句接受令牌,与 sshd_config 非常相似。
%u 宏扩展为用户名%h 扩展为主机%p 扩展为端口如果我以用户 mwl 的身份在端口2222上连接到主机 avarice ,SSH会自动在指定目录中创建套接字文件 mwl@avarice:2222。
PuTTY默认启用连接多路复用。要在打开会话之前关闭它,请打开PuTTY并从左侧窗格中选择SSH。您将看到一个名为 Share SSH connections if possible 的复选框。取消选择它。
任何可以读取OpenSSH的多路复用控制文件或访问PuTTY类似套接字的人都可以访问通过SSH连接传输的所有数据。原始连接已经过身份验证,因此这样的入侵者甚至不需要您的密码就可以在远程机器上获取终端。仅在您信任所有具有管理权限的人的客户端上使用连接多路复用。
通过多路SSH会话复制大文件可能会减慢其他会话的速度。
X转发在连接多路复用时效果不佳。
请记住,在多路复用时,您与服务器的所有SSH连接都会在您打开的第一个主机连接上运行。如果该连接失败,与之复用的所有连接也将失败。
就我个人而言,我只在单用户桌面系统上启用多路复用。其他人不同意我的观点。做对你的环境有意义的事情。
你会在很多地方听到SSH可以在通过网络发送数据之前压缩数据。这在33.6调制解调器是人们在家连接的标准方式时非常有用。在现代多兆比特连接上,压缩通常会减慢连接速度。只有在带宽严重受限的情况下,才考虑使用压缩。
压缩有意义的一种情况是转发X(【第8章】)。在 ssh(1) 中添加 -C 标志可以使转发的X连接的吞吐量增加一倍。
这涵盖了PuTTY和OpenSSH客户端的基础知识。现在让我们看看使用SSH在网络中移动文件。