真的，宇宙射线会导致部分 SSH 服务器的私钥泄露
如果你是 OpenSSL、LibreSSL、OpenSSH 的用户，你可以坐下来看看了，因为这不会影响你。最近一项学术研究展示了如下情况：对于某些特定设备，他人可以监听其 SSH 连接，然后借助一些运气在无声无息中破译出主机的私有 RSA 密钥，从而冒充该设备。冒充这些设备后，通过使用推断出的主机密钥私钥实施的中间人攻击，间谍可以安静地记录用户的登录信息，同时，通过将这些连接转发给真正的设备，他们还可以监控用户在远程 SSH 服务器上的活动。尽管 SSH 还有其他功能，但其主要应用场景仍然是用户登录到设备并通过命令行接口进行控制。据悉，可以通过被动监视从客户端到易受攻击设备的 SSH 服务器的连接，获得主机的 RSA 密钥私钥：无论是在签名生成过程中的偶发运算错误，还是因宇宙射线等微小故障产生的自然错误，都可以被观察和利用来推算 SSH 服务器的主机密钥私钥，这本应是保密的。虽然可能认为自然错误发生的概率很小，偶发错误可能已为众所周知，但实际上只要你连续观察足够多的到有漏洞的 SSH 服务器的 SSH 连接，你就有可能发现一个你可以利用的。重要的一点是，软件库 OpenSSL 和 LibreSSL，以及 OpenSSH，都未发现存在上述密钥推导问题的漏洞。由此，我们认为，网上的大部分设备、服务器和其他设备都不会受到影响，只有特定的物联网设备和类似的嵌入式设备可能会对此种攻击敏感。此外，这种问题也仅影响 RSA 密钥。细节由加利福尼亚大学圣地亚哥分校的 Keegan Ryan、Kaiwen He（他同时也在麻省理工学院任职）、George Arnold Sullivan 以及 Nadia Heninger 基于早期的一些研究，完成并撰写了这项研究。他们采用的技术，旨在揭示 RSA 密钥私钥，该技术源于 Florian Weimer 在 2015 年对 TLS 的突破性研究，以及 2022 年圣地亚哥论文的几位作者以及其他研究者的一些工作，这些工作可追溯到 1990 年代。信息安全专家 Thomas Ptacek 曾高度赞扬了 2023 年研究的合著者 Nadia Heninger，并在此分享了 RSA 密钥分析论文的摘要，以便于理解这个问题。我们同时也要感谢曾在 Register vulture 工作的 Dan Goodin，他在周一通过 Ars Technica 向我们报告了 UC 圣地亚哥论文的消息。基本上，当客户端尝试连接到一个容易受到攻击的 SSH 服务器时，它们在协商建立全面安全加密通信的过程中，服务器将会生成一个数字签名以供客户端检查，以确保其正在与预期的服务器通信。如我们之前所述，这个签名的计算过程可能会随机或意外地产生错误，聪明的算法可以从错误的签名中推导出服务器的私有 RSA 密钥，此密钥用于签名生成。对此的一种防范措施是在将签名发送给客户端前确保其计算正确；OpenSSL 和 LibreSSL 已经在实施这种防范。正如论文作者在他们的摘要中提到的：“我们证明了一种可能性：若 SSH 服务器在进行签名计算过程中出现自然故障，一名被动的网络攻击者便有机会获得其私有 RSA 主机密钥。在之前的研究中，我们通常认为这对于 SSH 协议是不可行的，因为签名中包含了一些信息，比如 Diffie-Hellman 共享密钥，这些信息对于被动的网络观察者来说无法获得。然而，我们证明了，在 SSH 中经常使用的签名参数下，如果出现了签名错误，我们便能有效地使用 格攻击 lattice attack 来恢复私钥。我们对 SSH、IKEv1、IKEv2 协议进行了安全分析，在此场景下，我们利用我们的攻击方法在现实环境中挖掘出几个存在漏洞的独立实现中的数百个被攻破的密钥。“一个被动的对手可以安静地监控合法的连接，不用冒被检测的风险，直到他们观察到一个包含私钥的错误签名。”研究团队做出了这样的结论：“然后，攻击者可以主动且不会被检测地冒充被攻破的主机，从而截取敏感数据。”研究人员表示，他们已经扫描了整个互联网，并翻查了以前收集的 SSH 扫描数据，以测量易受攻击的签名的流行程度。他们声称，他们的数据集涵盖了 52 亿条 SSH 记录和超过七年的观察，其中包含了超过 59 万个无效的 RSA 签名。通过他们的格密钥恢复技术，学者们表示，其中超过 4900 个错误的签名揭示了对应 RSA 公钥的因子分解。他们利用这些信息，推导出了 189 个公钥的私有 RSA 密钥。在他们的研究中，作者们发现，思科、Zyxel、山石网科和 Mocana 这四个制造商的产品都可能受到这种密钥侦测攻击。研究者已经向思科和 Zyxel 报告了这个问题，观察到两家供应商都迅速进行了调查行动。思科判定其 ASA 和 FTD 软件在 2022 年已经解决了此问题，且在这篇论文发布之前，公司正在对其 IOS 和 IOS XE 软件进行调查，看看如何应对此问题。同一时间，Zyxel 发现这个缺陷只影响到了它那些已停止服务的固件，并且它已经开始使用不受此问题影响的 OpenSSL。研究人员表示，他们没有成功地与山石网科和 Mocana 取得联系，所以决定把这个问题提交给了 CERT 协调中心。据称，自诩为 “SSH-2.0-SSHD” 的 SSH 服务器实现也可能受到攻击，这可能会影响到一些企业级的 Java 应用。有鉴于这个密钥推导技术的关键在于 PKCSv1.5，使用 PKCSv1.5-RSA 签名的 DNSSEC 可能也在风险之中。他们还指出，他们在 IPsec 连接中收集到的签名数据集不大，所以无法确定此协议是否也可能受到类似的密钥泄漏攻击。他们表示：“鉴于易受攻击的签名故障很罕见，根据我们的数据，我们无法对 IPsec 实现得出多少结论，我们认为这个问题值得进一步研究。”更新：已经与山石网科取得联系，官方确认该问题已在 2015 年发布的相关版本中修复，之后的版本也不存在相关问题。具体详情可以咨询山石网科客服或查看如下链接： https://www.hillstonenet.com.cn/security-notification/2015/07/28/dsfyj/（题图：MJ/f94093f0-9ffe-4cf1-82fb-cdac1427e923）via: https://www.theregister.com/2023/11/14/passive_ssh_key_compromise/作者：Jessica Lyons Hardcastle 译者：ChatGPT 校对：wxy
通过安全的网络连接在远程计算机上调用命令或程序。有一天，我正在测试如何在 将文件或目录复制到多个位置和系统时保持完整的文件权限。当我想检查远程系统上的文件权限时，我必须通过 SSH 登录它并检查属性。从远程系统多次登录和注销的过程让我有点烦，我想，如果我可以在远程 Linux 系统上通过 SSH 执行命令就好了。幸运的是，在浏览了 ssh 命令的手册页后，我找到了一个解决办法。如果你想知道如何本地运行远程系统上运行命令或脚本，而不登录到远程系统，下面的内容会告诉你如何做。1、通过 SSH 在远程 Linux 系统上执行命令从本地系统通过 SSH 在远程系统上运行命令或脚本的典型方法是：$ ssh <username@IP_Address-or-Doman_name> <Command-or-Script> 允许我给你们举几个例子：1.1、通过 SSH 在远程系统上运行单个命令假设你想要 查找远程 Linux 系统的内核详细信息。为此，只需运行：$ ssh sk@192.168.225.22 uname -a 这里，sk 是远程系统的用户名，192.168.225.22 是远程系统的 IP 地址，uname -a 是我想在远程系统上运行的命令。示例输出：看到没？我并没有实际登录到远程系统，但通过 SSH 在远程系统上执行了 uname 命令，并在本地系统的终端上显示了输出。你还可以像下面这样用引号指定命令。$ ssh sk@192.168.225.22 "uname -a" 或者，$ ssh sk@192.168.225.22 'uname -a' 如果你已经 更改了 SSH 协议的默认端口，只需使用 -p 参数指定它。$ ssh -p 2200 sk@192.168.225.22 uname -a 1.2、通过 SSH 在远程主机上执行多个命令你还可以在远程主机上运行多个命令，方法是将它们放在引号中。$ ssh sk@192.168.225.22 "uname -r && lsb_release -a" 或者：$ ssh sk@192.168.225.22 "uname -r ; lsb_release -a" 上面的命令将显示我的 Ubuntu 服务器的内核版本和发行版详细信息。示例输出：正如一位读者在下面的评论部分提到的那样，你应该用引号指定多个命令。如果不使用引号，第一个命令将在远程系统上执行，第二个命令将仅在本地计算机上执行。整个带引号的命令将按预期在远程计算机上运行。提示： 了解 && 和 ; 在命令中的区别：&& 操作符只有在第一个命令成功时才执行第二个命令。示例：sudo apt-get update && sudo apt-get upgrade 在上述示例中，如果第一个命令成功，才会执行 sudo apt-get upgrade。否则，它将不会运行。; 操作符会执行第二个命令，无论第一个命令是成功还是失败。示例：sudo apt-get update ; sudo apt-get upgrade 在上述示例中，即使第一个命令失败，sudo apt-get upgrade 也会执行。1.3、通过 SSH 在远程机器上调用有 sudo 权限的命令有些命令需要 sudo 权限才能运行。例如，以下命令将在我的远程系统上安装 apache2。$ ssh -t sk@192.168.225.22 sudo apt install apache2 示例输出：注意到了吗？我在上面的命令中使用了 -t 标志，我们需要使用它来强制进行伪终端分配。它用于在远程机器上执行任意基于屏幕的程序，这非常有用。例如，在实现菜单服务时。另外，我输入了两次密码。第一次是远程用户的密码，以便从本地系统通过 SSH 访问远程系统，第二次是为了向远程用户赋予 sudo 权限，以便安装应用程序（在本例中为 apache2）。让我们用以下命令检查 Apache 服务是否正在运行：$ ssh -t sk@192.168.225.22 sudo systemctl status apache2 sk@192.168.225.22's password: [sudo] password for sk: ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Thu 2019-12-19 11:08:03 UTC; 52s ago Main PID: 5251 (apache2) Tasks: 55 (limit: 2318) CGroup: /system.slice/apache2.service ├─5251 /usr/sbin/apache2 -k start ├─5253 /usr/sbin/apache2 -k start └─5254 /usr/sbin/apache2 -k start Dec 19 11:08:03 ubuntuserver systemd[1]: Starting The Apache HTTP Server... Dec 19 11:08:03 ubuntuserver apachectl[5227]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 2409:4072:51f:a1b6:a00:27ff:f Dec 19 11:08:03 ubuntuserver systemd[1]: Started The Apache HTTP Server. 同样的，我们可以通过 SSH 在本地系统上运行远程系统上的任何命令或脚本。1.4、通过 SSH 在远程系统上运行本地脚本让我们在本地系统上创建一个简单的脚本来显示关于远程系统的发行版名称、包管理和基本细节等。$ vi system_information.sh 添加以下行：#!/bin/bash #Name: Display System Details #Owner: OSTechNIx #---------------------------- echo /etc/*_ver* /etc/*-rel*; cat /etc/*_ver* /etc/*-rel* 按下 ESC 键，输入 :wq 保存退出。现在，通过 SSH 命令在远程系统上运行这个脚本：$ ssh sk@192.168.225.22 'bash -s' < system_information.sh 示例输出：sk@192.168.225.22's password: /etc/debian_version /etc/lsb-release /etc/os-release buster/sid DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS" NAME="Ubuntu" VERSION="18.04.2 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.2 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic 如果你没有在上面的命令中指定 bash -s，你将获得远程系统的详细信息，但伪终端不会被分配。1.5、将远程主机的命令输出保存到本地主机如果你希望与支持团队或同事共享远程系统上运行的命令输出，那么这非常有用。以下命令将通过 SSH 在远程系统运行 du -ah，并将输出保存在本地系统的 diskusage.txt 文件中。$ ssh sk@192.168.225.22 du -ah > diskusage.txt 然后，你可以通过使用 cat 命令或文本编辑器查看 diskusage.txt 文件来分析磁盘使用细节。$ cat diskusage.txt 4.0K ./.profile 4.0K ./.gnupg/private-keys-v1.d 8.0K ./.gnupg 76K ./data/image.jpg 128K ./data/file.pdf 20K ./data/text.docx 5.9M ./data/audio.mp3 6.1M ./data 0 ./.sudo_as_admin_successful 4.0K ./pacman?inline=false 4.0K ./.bash_logout 4.0K ./.wget-hsts 4.0K ./.bash_history 0 ./.cache/motd.legal-displayed 4.0K ./.cache 4.0K ./deb-pacman_1.0-0.deb 4.0K ./.bashrc 6.2M . 1.6、配置 SSH 密钥认证，避免输入密码如果你经常在远程系统上运行命令，你可能需要配置基于 SSH 密钥的身份验证，以便每次跳过密码输入。更多细节可以在以下链接中找到。Linux 系统下如何配置 SSH 密钥认证配置了基于 SSH 密钥的认证后，我们可以通过 SSH 在远程机器上执行命令，从而不需要输入密码：$ ssh sk@192.168.225.22 sudo apt update 2、通过 sshpass 在远程机器上运行命令如果你不想配置基于 SSH 密钥的身份验证，你可以使用 sshpass 实用程序。2.1、什么是 sshpass?sshpass 是为使用键盘交互密码身份验证模式运行 ssh 而设计的，但它以非交互的方式。简单来说，sshpass 提供了非交互式的方式来验证 SSH 会话。SSH 使用直接 TTY 访问来确保密码确实是由交互式键盘用户发出的。sshpass 在一个专用 tty 中运行 SSH，让它误以为从交互用户那里获得了密码。2.2、在 Linux 中安装 sshpass在许多 Linux 发行版的默认仓库中都有 sshpass 实用程序。例如，在 Debian、Ubuntu 及其衍生版本中，你可以使用下面的命令来安装 sshpass：$ sudo apt install sshpass 2.3、通过 SSH 和 sshpass 在远程机器上执行命令sshpass 可以通过参数接受密码，或者通过环境变量读取密码，也可以从文本文件中读取密码。警告： 所有这些方法都是 高度不安全的。所有系统用户都可以通过 ps 命令看到命令中的密码。不建议在生产中使用这些方法。最好使用基于密钥的身份验证。让我们看看每种方法的示例。将密码作为参数提供将密码作为参数提供，使用 -p 选项，如下所示：$ sshpass -p <remote-password> ssh remoteuser@ip-address <command-to-execute> 示例输出：$ sshpass -p ubuntu ssh ostechnix@192.168.1.30 uname -a 其中，-p ubuntu - 提供远程系统的密码。ostechnix@192.168.1.30 - 远程系统用户名和地址。uname -a - 要在远程计算机上执行的命令。示例输出：Linux Ubuntu22CT 5.15.60-1-pve #1 SMP PVE 5.15.60-1 (Mon, 19 Sep 2022 17:53:17 +0200) x86_64 x86_64 x86_64 GNU/Linux 密码作为环境变量提供在这个方法中，我们声明一个名为 SSHPASS 的环境变量，用远程环境的密码作为其值。然后我们使用 -e 标志，如下所示：$ SSHPASS=ubuntu sshpass -e ssh ostechnix@192.168.1.30 uname -a 从文本文件中读取密码使用 echo 命令在文本文件中追加密码：$ echo "ubuntu" > mypassword.txt 现在，将密码文件传递给带有 -f 标志的 sshpass，如下所示：$ sshpass -f mypassword.txt ssh ostechnix@192.168.1.30 uname -a 总结在本教程中，我们学习了一些通过安全的网络连接在远程计算机上调用命令或程序的方法。在所有的方法中，sshpass 方法是最不安全的，建议用户避免在生产系统中使用它。via: https://ostechnix.com/execute-commands-on-remote-linux-systems-via-ssh/作者：sk 选题：lkxed 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如今 SSH 已成为了登录远程服务器的默认方式。SSH 的全称是 “ 安全的 Shell Secure Shell ”，它功能强大、效率高，这个主流的网络协议用于在两个远程终端之间建立连接。让我们不要忘记它名称的“安全”部分，SSH 会加密所有的通信流量，以防止如劫持、窃听等攻击，同时提供不同的身份认证方式和无数个配置选项。在这份新手指南中，你会学到：SSH 的基本概念设置 SSH 服务器（在你想要远程登录的系统上）从客户端（你的电脑）通过 SSH 连接远程服务器SSH 的基本概念在学习配置过程前，让我们先了解一下 SSH 的全部基础概念。SSH 协议基于 客户端-服务器 server-client （CS）架构。“ 服务器 Server ”允许“ 客户端 Client ”通过通信通道进行连接。该信道是经过加密的，信息交换通过 SSH 公私钥进行管理。OpenSSH 是在 Linux、BSD 和 Windows 系统上提供 SSH 功能的最流行的开源工具之一。想要成功配置 SSH，你需要：在作为服务器的机器上部署 SSH 服务器组件，它由 openssh-server 包提供。在你远程访问服务器的客户端机器上部署 SSH 客户端组件，它由 openssh-client 包提供，大多数 Linux 和 BSD 发行版都已经预装好了。区分服务器和客户端是十分重要的事情。或许你不想要你的 PC 作为 SSH 服务器，除非你有充分理由希望其他人通过 SSH 连接你的系统。通常来说，你有一个专用的服务器系统。例如，一个 运行 Ubuntu 的树莓派。你可以 启用树莓派的 SSH 服务，这样你可以在你 PC 中的终端中，通过 SSH 控制并管理该设备。有了这些信息，让我们看看如何在 Ubuntu 上设置 SSH 服务器。在 Ubuntu 服务器中配置 SSH设置 SSH 并不复杂，只需要以下几步。前提一个在服务器端拥有 sudo 权限的用户可以下载所需包的互联网连接在你的网络中至少有另一个系统。可以是局域网中的另一台电脑，远程服务器或者计算机中托管的虚拟机。再次强调，在你想要通过 SSH 远程登录的系统上安装 SSH 服务。第一步：安装所需包让我们从打开终端输入一些必要命令开始。注意，在安装新的包或者软件前，要 更新你的 Ubuntu 系统，以确保运行的是最新版本的程序。sudo apt update && sudo apt upgrade 你要运行 SSH 服务器的包由 OpensSSH 的 openssh-server 组件提供：sudo apt install openssh-server 第二步：检查服务器状态当你下载并安装完包后，SSH 服务器应该已经运行了，但是为了确保万无一失我们需要检查一下：service ssh status 你还可以使用 systemctl 命令：sudo systemctl status ssh 你应该会看到这样的结果，其中 active 是高亮的。输入 q 退出该页面。如果你的结果中 SSH 服务没有运行，使用这个命令运行它：sudo systemctl enable --now ssh 第三步：允许 SSH 通过防火墙Ubuntu 带有名为 UFW（ 简单的防火墙 Uncomplicated Firewall ）的防火墙，这是管理网络规则的 iptables 的一个接口。如果启动了防火墙，它可能会阻止你连接服务器。想要配置 UFW 允许你的接入，你需要运行如下命令：sudo ufw allow ssh UFW 的运行状态可以通过运行 sudo ufw status 来检查。现在，我们的 SSH 服务器已经开始运行了，在等待来自客户端的连接。连接远程服务器你本地的 Linux 系统已经安装了 SSH 客户端。如果没有，你可以在 Ubuntu 中使用如下命令安装：sudo apt install openssh-client 要连接你的 Ubuntu 系统，你需要知道它的 IP 地址，然后使用 ssh 命令，就像这样：ssh username@address 将 用户名（username）改为你的系统上的实际用户名，并将 地址（address）改为你服务器的 IP 地址。如果你 不知道 IP 地址，可以在服务器的终端输入 ip a 查看结果。应该会看到这样的结果：可以看到我的 IP 地址是 192.168.1.111。让我们使用 username@address 格式进行连接。ssh team@192.168.1.111 这是你第一次连接到该 SSH 服务器，它会请求添加主机。输入 yes 并回车即可。SSH 会立即告诉你该主机已经被永久添加了，并要求你输入指定用户的密码，输入密码并再次按回车即可。瞧，你远程登录了你的 Ubuntu 系统！现在，你可以在远程服务器的终端里和寻常一样工作了。关闭 SSH 连接你只需要输入 exit 即可关闭连接，它会立马关闭不需要确认。在 Ubuntu 中关闭并禁止 SSH如果你想要停止 SSH 服务，需要运行该命令：sudo systemctl stop ssh 该命令会关闭 SSH 服务，直到重启它或者系统重启。想要重启它，输入：sudo systemctl start ssh 现在，如果你想要禁止 SSH 跟随系统启动，使用该命令：sudo systemctl disable ssh 该命令不会停止当前的 SSH 会话，只会在启动的时候生效。如果你想要它跟随系统启动，输入：sudo systemctl enable ssh 其他 SSH 客户端从 Linux 到 macOS，大多数 *nix 系统中都有 ssh 工具，但这并不是唯一的选项，这里有几个可以在其他操作系统中使用的客户端：PuTTY 是一个自由开源的 Windows 系统上的 SSH 客户端。它功能强大并且简单易用。如果你从 Windows 系统上连接你的 Ubuntu 服务器，PuTTY 是最好的选择。（LCTT 译注：切记从官方网站下载。）对安卓用户来说，JuiceSSH 是十分优秀的工具。如果你在旅途中需要一个移动客户端来连接你的 Ubuntu 系统，我强烈建议你试试 JuiceSSH。它已经出现了将近 10 年，并且可以免费使用。最后是 Termius，它可用于 Linux、Windows、macOS、iOS 和安卓。它有一个免费版本和几个付费选项。如果你运行大量服务器并进行共享连接的团队合作，那么 Termius 对你来说是一个不错的选择。总结在这份指导中，你可以在 Ubuntu 系统中设置 SSH 作为服务器，允许来自你电脑的远程安全的连接，便于你通过命令行开展工作。此，我推荐以下文章：Linux SSH 入门教程利用 SSH 配置文件管理多个 SSH 连接向 SSH 服务器添加公钥以进行无密码身份验证保护你的 SSH 服务器的 SSH 加固技巧远程工作快乐！via: https://itsfoss.com/set-up-ssh-ubuntu/作者：Chris Patrick Carias Stas 选题：lujun9972 译者：Donkey-Hao 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
使用开源的 PuTTY 工具，从 Windows 建立到 Linux 的 SSH 连接。在 Linux 世界中， 安全外壳 secure shell （SSH）协议是最为常用的、通过命令行控制远程计算机的方式。SSH 是真正的 Linux 原创，但是它在 Windows 世界中也越来越流行。甚至有了一份官方的 Windows 的 SSH 文档，那篇文档阐述了使用 OpenSSH 控制 Windows 的方法。这篇文章展示了如何使用了流行的开源工具 PuTTY，建立一个从 Windows 到 Fedora 33 Linux 系统的 SSH 连接。使用 SSH 的方法SSH 使用客户端-服务器模式，即 SSH 客户端会创建到 SSH 服务端的连接。SSH 服务器通常会作为 守护进程 Daemon 运行，所以它常被称为 SSHD。你很难找到一个不自带 SSH 守护进程的 Linux 发行版。在 Fedora 33 中，已安装了 SSH 守护进程，但是并未激活。你可以使用 SSH 控制几乎所有的 Linux 机器，无论它是作为虚拟机还是作为网络上的物理设备运行。一个常见的用例是 无头 headless 配置的嵌入式设备，如树莓派。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 :: 没有取消任何注释的默认配置在这个示例中应该是可以工作的。要检查 SSH 守护进程是否已经运行，输入 systemctl status sshd：$ 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][5],chacha20-[...] 如果它处于 未激活 inactive 状态，使用 systemctl start sshd 命令启动它。2、设置远程控制台在 Windows 下 下载 PuTTY 安装程序，然后安装并打开它。你应看到一个像这样的窗口：在“ 主机名（或 IP 地址） Host Name (or IP address) ”输入框，键入你的 Linux 系统的连接信息。本文设置了一个 Fedora 33 虚拟机，它使用桥接网络适配器，使我可以由 IP 地址 192.168.1.60 连接这个系统。点击“ 打开 Open ”，应会如图示的打开一个窗口：这是 SSH 的安全措施之一，是为了防止 中间人攻击 man-in-the-middle attack 。消息中的指纹应该匹配 Linux 系统中放在 /etc/ssh/ssh_host_ed25519_key.pub 的密钥。PuTTY 将这个密钥以 MD5 哈希值 的方式打印出来。要检查它的真实性，切换到 Linux 系统并打开一个控制台，然后输入：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) 点击“ 是 Yes ”以确认 PuTTY 的安全提示。主机系统的指纹现在存储在 PuTTY 的信任列表中，其位于 Windows 的注册表中的：HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys 输入正确的登录凭证，然后你应该进入控制台了，位置在你的用户主目录。3、通过网络复制文件除了远程控制台，你同样可以使用 PuTTY 通过 SSH 来传输文件。PuTTY 的安装目录在 C:\Program Files (x86)\PuTTY，在该目录下寻找 ppscp.exe。你既可以使用它从 Linux 系统复制文件，也可以复制文件到 Linux 系统。使用 Windows + R 然后输入 cmd 来打开命令提示符，从你的 Linux 用户主目录复制 MYFile.txt 到你的 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 <target> 4、隧道化一个协议假设你拥有一个 Linux 机器，为某些特别的应用运行一个基于 HTTP 的服务。你想从你的 Windows 机器通过互联网访问这个 HTTP 服务。而且，你不能将相关的 TCP 端口暴露在公网，因为：这个服务通过 HTTP 而非 HTTPS 运行根本没有用户管理和登录系统乍一看，建立这种架构不产生可怕的漏洞似乎是不可能的。但是 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然后返回 “ 会话 Session ” 部分，并像之前那样建立一个 SSH 链接。打开网页浏览器，然后转到 http://localhost:7000；你应该看见像这样的窗口：你成功的设置了端口转发！警告: 如果你选择在公网上暴露 TCP 端口 22 ，不要使用易于猜测的登录凭证。你将接受来自全世界的登录请求，它们使用常见的、标准的登录凭证以尝试登录你的 Linux 机器。相反，只允许已知的用户登录。这种登录限制可以通过 公钥加密 来实现，它使用一个密钥对，其中公钥存储在 SSH 主机上，而私钥保留在客户端。调试如果你难以连接你的 Linux 机器，你可以跟踪你的 SSH 守护进程的处理过程：journalctl -f -u sshd 这是一个普通的登录进程，但是其日志级别为 DEBUG，它看起来是这样的 :了解更多这篇文章几乎没有涉及到使用 SSH 的方法。如果你正在寻找一个特定用例的信息，你也许可以在互联网中找到无数的教程。我在工作中使用 PuTTY ，因为它易于设置，在两个操作系统间又具有良好的可操作性，使得它成为连接解决方案里的瑞士军刀。（文内图片来自：Stephan Avenwedde，CC BY-SA 4.0）via: https://opensource.com/article/21/6/ssh-windows作者：Stephan Avenwedde 选题：lujun9972 译者：yjacks 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
以下是我如何优化我的 SSH 体验并保护我的服务器不被非法访问。SSH（安全 Shell）是一个协议，它使你能够创建一个经过验证的私人连接，并使用加密密钥保护通道，在另一台机器上启动一个远程 Shell。使用这种连接，你可以执行远程命令，启动安全文件传输，转发套接字、显示和服务，等等。在 SSH 出现之前，大多数远程管理是通过 telnet 完成的，公平地说，一旦你能建立一个远程会话，你几乎可以做任何你需要的事情。这个协议的问题是，通讯是以纯明文的方式进行的，没有经过加密。使用 流量嗅探器 不需要太多努力就可以看到一个会话中的所有数据包，包括那些包含用户名和密码的数据包。有了 SSH，由于使用了非对称密钥，参与通信的设备之间的会话是加密的。如今，这比以往任何时候都更有意义，因为所有的云服务器都是由分布在世界各地的人管理的。3 个配置 SSH 的技巧SSH 协议最常见的实现是 OpenSSH，它由 OpenBSD 项目开发，可用于大多数 Linux 和类 Unix 操作系统。一旦你安装了这个软件包，你就会有一个名为 sshd_config 的文件来控制该服务的大部分行为。其默认设置通常是非常保守的，但我倾向于做一些调整，以优化我的 SSH 体验，并保护我的服务器不被非法访问。1、改变默认端口这是一个并非所有管理员都记得的问题。任何有端口扫描器的人都可以发现一个 SSH 端口，即使你之后把它移到别的端口，所以你很难把自己从危险中移除，但这样却会有效的避免了数百个针对你的服务器扫描的不成熟脚本。这是一个可以让你省心，从你的日志中减去大量的噪音的操作。在写这篇文章时，我在一个云服务提供商上设置了一个 SSH 服务器，默认端口 TCP 22，每分钟平均被攻击次数为 24 次。在将端口改为一个更高的数字，即 TCP 45678 后，平均每天有两个连接并用各种用户名或密码进行猜测。要改变 SSH 的默认端口，在你喜欢的文本编辑器中打开 /etc/ssh/sshd_config，将 Port 的值从 22 改为大于 1024 的某个数字。这一行可能被注释了，因为 22 是默认的（所以不需要在配置中明确声明），所以在保存之前取消注释。Port 22122 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress :: 一旦你改变了端口并保存了文件，重新启动 SSH 服务器：$ sudo systemctl restart sshd 2、不要使用密码现在有一个普遍的潮流是停止使用密码作为认证手段，双因素认证等方法越来越受欢迎。OpenSSH 可以使用非对称密钥进行认证，因此不需要记住复杂的密码，更不需要每隔几个月轮换一次密码，也不需要担心有人在你建立远程会话时进行“肩后偷窥”。使用 SSH 密钥可以让你快速、安全地登录到你的远程设备上。这往往意味着花费在错误的用户名和密码上的时间更少。登录令人愉快的简单。当没有密钥时，就没有入口，甚至没有提示符。要使用这个功能，你必须同时配置客户机（在你面前的计算机）和服务器（远程机器）。在客户端机器上，你必须生成一个 SSH 密钥对。这包括一个公钥和一个私钥。正如它们的名字所暗示的，一个公开的密钥是供你分发给你想登录的服务器的，另一个是私人的密钥，必须不与任何人分享。使用 ssh-keygen 命令可以创建一个新的密钥对，并使用 -t 选项来指定一个好的、最新的密码学库，如 ed25519：$ ssh-keygen -t ed25519 Generating public/private ed25519 key pair. Enter file in which to save the key (~/.ssh/id_ed25519): 在密钥创建过程中，你会被提示为文件命名。你可以按回车键来接受默认值。如果你将来创建了更多的密钥，你可以给每个密钥起一个自定义的名字，但有多个密钥意味着你要为每次交互指定使用哪个密钥，所以现在只要接受默认即可。你还可以给你的密钥一个口令。这可以确保即使别人设法获得你的私钥（这本身就不应该发生），没有你的口令，他们也无法将其投入使用。这对某些密钥来说是一种有用的保护措施，而对其他密钥来说则不合适（特别是那些用于脚本的密钥）。按回车键让你的密钥没有口令，或者你选择创建一个口令。要把你的密钥复制到服务器上，使用 ssh-copy-id 命令。例如，如果我拥有一台名为 example.com 的服务器，那么我可以用这个命令把我的公钥复制到它上面：$ ssh-copy-id jgarrido@example.com 这将在服务器的 .ssh 目录下创建或修改 authorized_keys 文件，其中包含你的公钥。一旦确认 ssh-copy-id 命令完成了它所做的事情，尝试从你的电脑上登录，以验证你可以在没有密码的情况下登录（或者如果你选择使用你的密钥的口令，就输入密钥口令）。在没有使用你的服务器帐户的密码登录到你的服务器上后，编辑服务器的 sshd_config 并将 PasswordAuthentication 设置为 no。PasswordAuthentication no 重新启动 SSH 服务以加载新的配置：$ sudo systemctl restart sshd 3、决定谁可以登录大多数发行版不允许 root 用户通过 SSH 登录，这确保只有非特权账户是活跃的，根据需要使用 sudo 命令来提升权限。这就防止了一个明显的、令人痛苦的目标（root）受到简单而常见的脚本攻击。同样，OpenSSH 的一个简单而强大的功能是能够决定哪些用户可以登录到一台机器。要设置哪些用户被授予 SSH 访问权，在你最喜欢的文本编辑器中打开 sshd_config 文件，并添加这样一行：AllowUsers jgarrido jane tux 重新启动 SSH 服务以加载新的配置选项。这只允许三个用户（jgarrido、jane 和 tux）登录或在远程机器上执行任何操作。总结你可以使用 OpenSSH 来实现一个强大而稳健的 SSH 服务器。这些只是加固你的系统的三个有用的选项。尽管如此，在 sshd_config 文件中仍有大量的功能和选项可以打开或关闭，而且有许多很棒的应用程序，如 Fail2ban，你可以用来进一步保护你的 SSH 服务。via: https://opensource.com/article/22/2/configure-ssh-privacy作者：Jonathan Garrido 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
学会使用安全外壳协议连接远程计算机。使用 Linux，你只需要在键盘上输入命令，就可以巧妙地使用计算机（甚至这台计算机可以在世界上任何地方），这正是 Linux 最吸引人的特性之一。有了 OpenSSH，POSIX 用户就可以在有权限连接的计算机上打开安全外壳协议，然后远程使用。这对于许多 Linux 用户来说可能不过是日常任务，但从没操作过的人可能就会感到很困惑。本文介绍了如何配置两台计算机的 安全外壳协议 secure shell （简称 SSH）连接，以及如何在没有密码的情况下安全地从一台计算机连接到另一台计算机。相关术语在讨论多台计算机时，如何将不同计算机彼此区分开可能会让人头疼。IT 社区拥有完善的术语来描述计算机联网的过程。 服务 service ： 服务是指在后台运行的软件，因此它不会局限于仅供安装它的计算机使用。例如，Web 服务器通常托管着 Web 共享 服务。该术语暗含（但非绝对）它是没有图形界面的软件。 主机 host ： 主机可以是任何计算机。在 IT 中，任何计算机都可以称为 主机，因为从技术上讲，任何计算机都可以 托管 host 对其他计算机有用的应用程序。你可能不会把自己的笔记本电脑视为 主机，但其实上面可能正运行着一些对你、你的手机或其他计算机有用的服务。 本地 local ： 本地计算机是指用户或某些特定软件正在使用的计算机。例如，每台计算机都会把自己称为 localhost。 远程 remote ： 远程计算机是指你既没在其面前，也没有在实际使用的计算机，是真正意义上在 远程 位置的计算机。现在术语已经明确好，我们可以开始了。在每台主机上激活 SSH要通过 SSH 连接两台计算机，每个主机都必须安装 SSH。SSH 有两个组成部分：本地计算机上使用的用于启动连接的命令，以及用于接收连接请求的 服务器。有些计算机可能已经安装好了 SSH 的一个或两个部分。验证 SSH 是否完全安装的命令因系统而异，因此最简单的验证方法是查阅相关配置文件：$ file /etc/ssh/ssh_config /etc/ssh/ssh_config: ASCII text 如果返回 No such file or directory 错误，说明没有安装 SSH 命令。SSH 服务的检测与此类似（注意文件名中的 d）：$ file /etc/ssh/sshd_config /etc/ssh/sshd_config: ASCII text 根据缺失情况选择安装两个组件：$ sudo dnf install openssh-clients openssh-server 在远程计算机上，使用 systemd 命令启用 SSH 服务：$ sudo systemctl enable --now sshd 你也可以在 GNOME 上的 系统设置 或 macOS 上的 系统首选项 中启用 SSH 服务。在 GNOME 桌面上，该设置位于 共享 面板中：开启安全外壳协议现在你已经在远程计算机上安装并启用了 SSH，可以尝试使用密码登录作为测试。要访问远程计算机，你需要有用户帐户和密码。远程用户不必与本地用户相同。只要拥有相应用户的密码，你就可以在远程机器上以任何用户的身份登录。例如，我在我的工作计算机上的用户是 sethkenlon ，但在我的个人计算机上是 seth。如果我正在使用我的个人计算机（即作为当前的本地计算机），并且想通过 SSH 连接到我的工作计算机，我可以通过将自己标识为 sethkenlon 并使用我的工作密码来实现连接。要通过 SSH 连接到远程计算机，你必须知道其 IP 地址或可解析的主机名。在远程计算机上使用 ip 命令可以查看该机器的 IP 地址：$ ip addr show | grep "inet " inet 127.0.0.1/8 scope host lo inet 10.1.1.5/27 brd 10.1.1.31 [...] 如果远程计算机没有 ip 命令，可以尝试使用 ifconfig 命令（甚至可以试试 Windows 上通用的 ipconfig 命令）。127.0.0.1 是一个特殊的地址，它实际上是 localhost 的地址。这是一个 环回 loopback 地址，系统使用它来找到自己。这在登录远程计算机时并没有什么用，因此在此示例中，远程计算机的正确 IP 地址为 10.1.1.5。在现实生活中，我的本地网络正在使用 10.1.1.0 子网，进而可得知前述正确的 IP 地址。如果远程计算机在不同的网络上，那么 IP 地址几乎可能是任何地址（但绝不会是 127.0.0.1），并且可能需要一些特殊的路由才能通过各种防火墙到达远程。如果你的远程计算机在同一个网络上，但想要访问比自己的网络更远的计算机，请阅读我之前写的关于 在防火墙中打开端口 的文章。如果你能通过 IP 地址 或 主机名 ping 到远程机器，并且拥有登录帐户，那么就可以通过 SSH 接入远程机器：$ ping -c1 10.1.1.5 PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data. 64 bytes from 10.1.1.5: icmp_seq=1 ttl=64 time=4.66 ms $ ping -c1 akiton.local PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data. 至此就成功了一小步。再试试使用 SSH 登录：$ whoami seth $ ssh sethkenlon@10.1.1.5 bash$ whoami sethkenlon 测试登录有效，下一节会介绍如何激活无密码登录。创建 SSH 密钥要在没有密码的情况下安全地登录到另一台计算机，登录者必须拥有 SSH 密钥。可能你的机器上已经有一个 SSH 密钥，但再多创建一个新密钥也没有什么坏处。SSH 密钥的生命周期是在本地计算机上开始的，它由两部分组成：一个是永远不会与任何人或任何东西共享的私钥，一个是可以复制到任何你想要无密码访问的远程机器上的公钥。有的人可能会创建一个 SSH 密钥，并将其用于从远程登录到 GitLab 身份验证的所有操作，但我会选择对不同的任务组使用不同的密钥。例如，我在家里使用一个密钥对本地机器进行身份验证，使用另一个密钥对我维护的 Web 服务器进行身份验证，再一个单独的密钥用于 Git 主机，以及又一个用于我托管的 Git 存储库，等等。在此示例中，我将只创建一个唯一密钥，以在局域网内的计算机上使用。使用 ssh-keygen 命令创建新的 SSH 密钥：$ ssh-keygen -t ed25519 -f ~/.ssh/lan -t 选项代表 类型 ，上述代码设置了一个高于默认值的密钥加密级别。-f 选项代表 文件，指定了密钥的文件名和位置。运行此命令后会生成一个名为 lan 的 SSH 私钥和一个名为 lan.pub 的 SSH 公钥。使用 ssh-copy-id 命令把公钥发送到远程机器上，在此之前要先确保具有远程计算机的 SSH 访问权限。如果你无法使用密码登录远程主机，也就无法设置无密码登录：$ ssh-copy-id -i ~/.ssh/lan.pub sethkenlon@10.1.1.5 过程中系统会提示你输入远程主机上的登录密码。操作成功后，使用 -i 选项将 SSH 命令指向对应的密钥（在本例中为 lan）再次尝试登录：$ ssh -i ~/.ssh/lan sethkenlon@10.1.1.5 bash$ whoami sethkenlon 对局域网上的所有计算机重复此过程，你就将能够无密码访问这个局域网上的每台主机。实际上，一旦你设置了无密码认证，你就可以编辑 /etc/ssh/sshd_config 文件来禁止密码认证。这有助于防止其他人使用 SSH 对计算机进行身份验证，除非他们拥有你的私钥。要想达到这个效果，可以在有 sudo 权限的文本编辑器中打开 /etc/ssh/sshd_config 并搜索字符串 PasswordAuthentication，将默认行更改为：PasswordAuthentication no 保存并重启 SSH 服务器：$ sudo systemctl restart sshd && echo "OK" OK $ 日常使用 SSHOpenSSH 改变了人们对操作计算机的看法，使用户不再被束缚在面前的计算机上。使用 SSH，你可以访问家中的任何计算机，或者拥有帐户的服务器，甚至是移动和物联网设备。充分利用 SSH 也意味着解锁 Linux 终端的更多用途。如果你还没有使用过 SSH，请试一下它吧。试着适应 SSH，创建一些适当的密钥，以此更安全地使用计算机，打破必须与计算机面对面的局限性。via: https://opensource.com/article/20/9/ssh作者：Seth Kenlon 选题：lujun9972 译者：unigeorge 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在你作为 Linux 系统管理员的职业生涯中，你可以使用 Secure Shell（SSH）远程访问 Linux 服务器或桌面系统。很有可能，你已经使用过了。在某些情况下，你会通过 SSH 一次性登录多个 Linux 服务器。实际上，SSH 很可能是 Linux 工具箱中最常用的工具之一。因此，你会希望操作尽可能高效。对于许多系统管理员来说，没有什么比命令行更有效的了。但是，有些用户确实更喜欢 GUI 工具，尤其是从一台桌面台式机远程连接到服务器上工作时。如果你碰巧喜欢 GUI 工具，那么你肯定想了解一下 Linux 上的一些出色的 SSH 图形界面工具。将其与独特的终端窗口相结合，可以从同一窗口远程访问多台计算机，你便拥有了高效工作所需的一切。让我们看以下这三个工具，找出其中一个（或多个）是否完全适合你的需求。我将在 Elementary OS 上演示这些工具，但是大多数流行的发行版都可以使用它们。PuTTY只要是久经沙场的人都知道 PuTTY。 实际上，PuTTY 是从 Windows 环境通过 SSH 连接到 Linux 服务器的事实标准工具。但是 PuTTY 不仅适用于 Windows。实际上，从其标准存储库中，PuTTY 也可以安装到 Linux 上。 PuTTY 的功能列表包括：保存会话通过 IP 地址或主机名链接定义备用 SSH 端口链接类型定义日志记录键盘、响铃、外观、连接等选项本地和远程隧道配置支持代理支持X11 隧道PuTTY GUI 主要是一种保存 SSH 会话的方式，因此，你可以更轻松地管理那些你需要不断远程登录、登出的各种 Linux 服务器和桌面台式机。从 PuTTY 连接到 Linux 服务器后，你将拥有一个可以运行的终端窗口。此时，你可能会问自己，为什么不只在终端窗口中工作？对于某些人来说，保存会话的便捷性确实使 PuTTY 值得使用。在 Linux 上安装 PuTTY 很简单。例如，你可以在基于 Debian 的发行版上执行命令：sudo apt-get install -y putty 安装后，你可以从桌面菜单运行 PuTTY GUI 或执行命令 putty。在“ PuTTY 配置 PuTTY Configuration ” 窗口（图 1）中，在 “ 主机名（或 IP 地址） HostName (or IP address) ”位置键入主机名或 IP 地址，配置 端口 Port ”（如果不是默认值 22），从“ 连接类型 Connection type ”中选择 “SSH” ，然后单击“ 打开 Open ”。图 1：PuTTY 连接配置窗口。建立连接后，系统将提示你输入远程服务器上的用户凭据（图 2）。图 2：使用 PuTTY 登录到远程服务器。要保存会话（以便不必总是键入远程服务器信息），填写 IP 地址（或主机名），配置端口和连接类型，然后（在单击 “ 打开 Open ” 之前），在 “ 保存会话 Saved Sessions ” 顶部文本区域中键入链接的名称，然后单击 “ 保存 Save ”。 这样将保存此会话的配置。若要连接到已保存的会话，请从 “ 已保存的会话 Saved Sessions ” 窗口中选择它，单击 “ 加载 Load ”，然后单击 “ 打开 Open ”。 然后，系统将提示你输入远程服务器上的远程凭据登录远程服务器。EasySSH尽管 EasySSH 没有提供 PuTTY 中提供的大量配置选项，但是（顾名思义）它非常易于使用。 EasySSH 的最佳功能之一是提供标签式界面，因此你可以打开多个 SSH 连接并在它们之间快速切换。 EasySSH 的功能包括：分组（你可以将选项卡分组以获得更高效的体验）。保存用户名/密码。外观选项。支持本地和远程隧道。在 Linux 桌面上安装 EasySSH 很简单，因为可以通过 flatpak 安装该应用程序（这意味着你必须在系统上安装 Flatpak ）。 安装 flatpak 后，使用以下命令添加 EasySSH ：sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo sudo flatpak install flathub com.github.muriloventuroso.easyssh 使用以下命令运行 EasySSH ：flatpak run com.github.muriloventuroso.easyssh 你可以在其中单击左上角的 “+” 按钮打开 EasySSH 应用程序。 在出现的窗口（图 3）中，根据需要配置 SSH 连接。图 3：在 EasySSH 中添加连接很简单。添加连接后，它将显示在主窗口的左侧导航中（图 4）。图 4：EasySSH 主窗口。要在 EasySSH 中连接到远程服务器，请从左侧导航中选择它，然后单击 “ 连接 Connect ” 按钮（图 5）。图 5：使用 EasySSH 连接到远程服务器。EasySSH 的一个注意事项是你必须在连接配置中保存用户名和密码（否则连接将失败）。这意味着有权访问运行 EasySSH 的桌面的任何人都可以在不知道密码的情况下远程访问你的服务器。因此，你必须始终记得在外出时锁定桌面屏幕（并确保使用强密码）。你最不希望的就是避免服务器受到不必要的登录攻击。TerminatorTerminator 实际上不是 SSH GUI。相反，Terminator 的功能是作为一个单一窗口，使你可以一次运行多个终端（甚至一组终端）。实际上，你可以打开 Terminator，将窗口垂直和水平拆分（直到拥有所需的所有终端），然后通过标准 SSH 命令连接到所有远程 Linux 服务器（图 6）。图 6：Terminator 分为三个不同的窗口，每个窗口都连接到不同的 Linux 服务器。要安装 Terminator，请执行以下命令：sudo apt-get install -y terminator 安装后，从桌面菜单或用命令 terminator 打开该工具。打开窗口后，你可以在 Terminator 内部右键单击，然后选择 “ 水平分割 Split Horizontally ” 或 “ 垂直分割 Split Vertically ”。继续拆分终端，直到你打开所需的终端为止，然后开始远程管理这些服务器。使用 Terminator 的注意事项是它不是标准的 SSH GUI 工具，因为它不会保存你的会话或使你可以快速访问这些服务器。换句话说，你将始终必须手动登录到远程 Linux 服务器。但是，能够并行查看远程 Secure Shell 会话确实使管理多个远程计算机变得容易得多。少而精的选择Linux 没有多少可用的 SSH GUI 工具。为什么呢？因为大多数管理员更喜欢简单地打开终端窗口，并使用标准命令行工具来远程访问服务器。但是，如果需要 GUI 工具，则有两个可靠的选择，和一个使登录多台计算机稍微容易一些的终端。尽管对于那些寻找 SSH GUI 工具的人来说只有少数选择，但是可用的那些肯定值得你花时间，根据需要尝试其中之一。via: https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux作者：Jack Wallen 选题：lujun9972 译者：stevenzdg988 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
使用 nccm 让你的终端连接 SSH 会话更快、更稳、更轻松。OpenSSH 很常用，但没有一个知名的连接管理器，因此我开发了 ncurses SSH 连接管理器（nccm）来填补这个重要的空白。 nccm 是一个简单的 SSH 连接管理器，具有非常便于移植的终端界面（就如项目名称所示，使用 ncurses 编写）。最重要的是，它使用起来非常简单。有了 nccm，你可以花费最少的精力和最少的按键连接到你选择的 SSH 会话。安装 nccm最快的方式是从它的 Git 仓库克隆该项目：$ git clone https://github.com/flyingrhinonz/nccm nccm.git 在 nccm.git/nccm 的文件夹中有两个文件：nccm 自身和 nccm.yml 配置文件。首先将 nccm 脚本复制到系统目录 /usr/local/bin/ 中并添加执行权限，也可以通过使用install 命令来完成操作：$ sudo install -m755 nccm –target-directory /usr/local/bin 文件 nccm.yml 可以拷贝到以下任意一个位置，默认从找到的第一个位置获取配置:~/.config/nccm/nccm.yml~/.nccm.yml~/nccm.yml/etc/nccm.ymlnccm 需要在 Python 3 的环境中运行，这在大部分的 Linux 环境是没问题的。大多数 Python 库的依赖包已经作为 Python 3 的一部分存在，但是，有一些 YAML 的依赖包和实用程序是你必须安装的。如果你没有安装 pip，你可以使用包管理器来安装它。在安装的同时，也请安装 yamllint 应用程序来帮助你验证 nccm.yml 文件。在 Debian 或类似系统使用 apt 命令：$ sudo apt install python3-pip yamllint 在 Fedora 或者类似系统使用 dnf 命令：$ sudo dnf install python3-pip yamllint PyYAML 也是必须安装的，可以通过使用 pip 来安装：$ pip3 install --user PyYAML 使用 nccm开始之前，需要修改 nccm.yml 文件来添加 SSH 连接配置，可以参照示例文件格式化 YAML 文件。仿照示例文件在开头添加连接名称，配置项使用两个空格缩进。不要忘了冒号（:），这是 YAML 的语言的格式。不要担心你的 SSH 会话信息以何顺序排列，因为 nccm 在程序内提供了排序的方式。如果修改完成，可以使用 yamllint 来校验配置：$ yamllint ~/.config/nccm/nccm.yml 如果没有错误信息返回，说明文件的内容格式是正确的，可以进行下面的步骤。如果 nccm 可以从你的路径中找到并且可以执行，那么输入 nccm 就可以启动 TUI（文本用户界面）了。如果你看到 Python 3 抛出的异常，请检查依赖包是否正确安装，任何异常都应该提到缺少的依赖包。只要你没有在 YAML 配置文件中更改 ncm_config_control 模式，那么你可以使用以下的键盘按键来控制：Up/Down 方向键 - 移动光标Home/End - 跳转到文件开始和结尾PgUp/PgDn - 以页为单位查看Left/Right 方向键 - 水平滚动TAB - 在文本框之间移动回车 - 连接选中的 SSH 会话Ctrl-h - 显示帮助菜单Ctrl-q/Ctrl-c - 退出F1-F5 或 ! @ # $ % - 按 1-5 列排序使用 F1 到 F5 来按 1-5 列排序，如果你的设备占用了这些 F1 - F5 键，你可以使用! @ # $ % 来替代。默认界面显示 4 列内容，但我们将用户名和服务器地址作为单独的列来排序，这样我们就有了 5 个排序方式。你也可以通过再次按下排序的按键来逆转排序。在选中的行上按回车可以建立会话。在 Filter 文本框中输入过滤内容，会用输入的内容以“与”的关系来过滤输出内容。这是不区分大小写的，而条目间用空白分隔。在 Conn 部分也是如此，但在这里按回车键可以连接到那个特定的条目编号。这个工具还有许多功能需要你去发掘，比如专注模式，这些部分留下等待你去探索，也可以查看项目主页或者内置的帮助文档查看更多细节内容。项目的 YAML 配置文件的文档是完善的，所以你可以查阅修改使 nccm 使用起来更加顺手。nccm 项目是非常希望得到你的反馈的，所以你可以复刻该项目然后添加更多新功能，欢迎大家提出拉取请求。使用 nccm 来放松连接 SSH 的压力像我一样，我希望这个工具可以对你有用，感谢能够为开源工作增加自己的贡献，请接受 nccm 作为我对开源项目自由、高效工作所做的贡献。via: https://opensource.com/article/20/9/ssh-connection-manager作者：Kenneth Aaron 选题：lujun9972 译者：hom 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
需要远程工作的看一下。使用这个有用的开源解决方案，从任何地方快速地连接和访问你的所有设备。随着对连接和远程工作的需求的增长，访问远程计算资源变得越来越重要。但是，提供对设备和硬件的外部访问的要求使此任务变得复杂而有风险。旨在减少此类麻烦的 ShellHub 是一个云服务器，允许从任何外部网络常规访问这些设备。ShellHub 是一个 Apache 2.0 许可的开源解决方案，它可满足所有这些需求，并允许用户通过一个帐户连接和管理多个设备。它的开发是为了方便开发者和程序员的工作，使得任何硬件架构的 Linux 设备的远程访问成为可能。仔细观察，ShellHub 方案使用 HTTP 传输层来封装 SSH 协议。这种传输层的选择可以在大多数网络上无缝使用，因为大多数公司的防火墙规则和策略通常都可以使用并接受它。下面这些示例使用 2020 年 6 月 10 日发布的 ShellHub 版本 0.3.2。使用 ShellHub要访问该平台，只需进入 shellhub.io 并注册一个自己的帐户。你的注册数据将帮助开发团队了解用户资料并提供有关如何改进平台的更多信息。图 1：shellhub.io 中的注册表格ShellHub 有直观、简洁的界面，这让所有的信息和功能都能以最快的方式呈现。注册后，你会看到一块仪表板，这时可以注册你的第一台设备。添加设备要启用通过 ShellHub 连接设备，你需要生成一个标识符，它用于在设备连接到服务器时对你的设备进行身份验证。此标识必须配置在代理（ShellHub 客户端）内部，该代理必须与镜像一起保存在设备中，或者必须添加为 Docker 容器。ShellHub 默认使用 Docker 运行代理，这非常方便，因为它在现有系统上提供了一种无痛的添加方式，支持 Docker 是唯一的要求。要添加设备，你需要粘贴命令行，它显示在 ShellHub Cloud 的对话框中（请参见图 2）。图 2：将设备添加到 ShellHub Cloud设备默认使用它的 MAC 地址作为其主机名。在内部，该设备由其密钥标识，这是在设备注册期间生成的，用于与服务器进行身份验证。访问设备要访问你的设备，只需进入仪表板中的“查看所有设备”，或单击左侧菜单上的“设备”。这将列出你所有已注册的设备。设备状态可在页面上轻松看到。在线设备旁边会显示一个绿色图标，可以单击终端图标进行连接。你接着输入密码，最后单击”连接“按钮，请参见（图 3）。图 3：使用网络上的终端访问设备另一种访问设备的方法是从类似 PuTTY、Termius 之类的 SSH 客户端，甚至 Linux 终端访问。我们可以使用称为 SSHID 的 ShellHub 标识作为连接的目的地址（例如 ssh username@SSHID）。图 4 说明了如何使用在终端中使用 Linux SSH 客户端连接到我们的计算机。图 4：使用 Linux 终端连接到设备无论你何时登录 ShellHub Cloud 平台，你都可以访问仪表板上的所有已注册设备，这样你可以随时随地访问它们。ShellHub 通过一个开源平台，以透明的方式为您与远程机器保持通信安全的过程增加了简单性。在 GitHub 上加入 ShellHub 社区，或随时通过 Gitter 或通过电子邮件 contato@ossystems.com.br 向开发团队发送你的建议或反馈。我们很乐意收到社区成员的贡献！via: https://opensource.com/article/20/7/linux-shellhub作者：Domarys 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
有时你无法从本地连接到 SSH 服务器。还有时，你可能想为 SSH 连接添加额外的安全层。在这些情况下，通过代理服务器连接到 SSH 服务器是一种解决方式。Squid 是提供缓存和代理服务的全功能代理服务器应用。它通常用于在浏览过程中重用和缓存以前请求的网页来帮助缩短响应时间并减少网络带宽。但是在本篇中，你将配置 Squid 作为 SSH 代理服务器，因为它是强大的受信任代理服务器，易于配置。安装和配置使用 sudo 安装 squid 软件包：$ sudo dnf install squid -y squid 配置文件非常庞大，但是我们只需要配置其中一些。Squid 使用访问控制列表来管理连接。编辑 /etc/squid/squid.conf 文件，确保你有下面解释的两行。首先，指定你的本地 IP 网络。默认配置文件已经列出了最常用的，但是如果没有，你需要添加你的配置。例如，如果你的本地 IP 网络范围是 192.168.1.X，那么这行会是这样：acl localnet src 192.168.1.0/24 接下来，添加以下行，将 SSH 端口添加为安全端口：acl Safe_ports port 22 保存该文件。现在启用并重启 squid 代理服务：$ sudo systemctl enable squid $ sudo systemctl restart squid squid 代理默认监听 3128 端口。配置 firewalld 允许此服务：$ sudo firewall-cmd --add-service=squid --perm $ sudo firewall-cmd --reload 测试 ssh 代理连接要通过 ssh 代理服务器连接到服务器，我们将使用 netcat。如果尚未安装 nmap-ncat，请安装它：$ sudo dnf install nmap-ncat -y 这是标准 ssh 连接示例：$ ssh user@example.com 这是使用 squid 代理服务器作为网关连接到该服务器的方式。此示例假定 squid 代理服务器的 IP 地址为 192.168.1.63。你还可以使用 squid 代理服务器的主机名或 FQDN：$ ssh user@example.com -o "ProxyCommand nc --proxy 192.168.1.63:3128 %h %p" 以下是这些选项的含义：ProxyCommand – 告诉 ssh 使用代理命令。nc – 用于建立与代理服务器连接的命令。这是 netcat 命令。%h – 代理服务器的主机名或 IP 地址的占位符。%p – 代理服务器端口号的占位符。有很多方法可以配置 SSH 代理服务器，但这是入门​​的简单方法。via: https://fedoramagazine.org/configure-ssh-proxy-server/作者：Curt Warfield 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出